在C#中从Firebase中驱动JSON对象

时间:2015-12-17 12:53:43

标签: c# json firebase

我正在查询Firebase并检索一组对象:

{"-K5f0ccEKkVkxTAavQKY": {
  "Appeal": {
    "ID": "1450273330435",
    "comps": [
      162248,
      162272,
      162273,
      162281,
      162544
    ],
    "property": {
      "Address": "15 Main Street",
      "propID": 169729
    },
    "timeDateStamp": "Wed Dec 16 2015 08:42:10 GMT-0500 (Eastern Standard Time)",
    "userUUID": "google:229139952703238437512",
    "year": 2016
  }
}}

我想将它们反序列化为具有此定义的对象:

public class Appeal
{
    public string ID;
    public List<string> comps;
    public AppealProperty property;
    public string timeDateStamp;
    public string UUID;
    public int year;
}

public class AppealProperty
{
    public string address;
    public string propID;
}

我把它反序列化很麻烦。我不需要初始字符串(例如"K5f0ccEKkVkxTAavQKY")。如果需要,我可以更改对象定义。我觉得词典很有用。

3 个答案:

答案 0 :(得分:5)

您可以将数据序列化到以下类中。

public class AppealProperty
{
    public string Address { get; set; }
    public int propID { get; set; }
}

public class Appeal
{
    public string ID { get; set; }
    public List<int> comps { get; set; }
    public AppealProperty property { get; set; }
    public string timeDateStamp { get; set; }
    public string userUUID { get; set; }
    public int year { get; set; }
}


public class FireBase
{
    public Appeal Appeal { get; set; }
}

public class RootObject
{
    [JsonProperty(PropertyName = " - K5f0ccEKkVkxTAavQKY")]
    public FireBase FireBaseRoot
    {
        get;
        set;
    }
}

假设您使用的是JSON.NET,那么您可以使用以下代码获取您所关注的对象:

var firebaseObject = JsonConvert.DeserializeObject<RootObject>(json);
var data = firebaseObject.FireBaseRoot.Appeal;

如果根名称是动态的,如评论所示,您可以跳过根,然后直接进入FireBase类:

JObject parsedJson = JObject.Parse(json);
var fireBase = parsedJson.First.Children().First().ToObject(typeof (FireBase));

答案 1 :(得分:4)

快速而脏的对象是使用Dictionary<string,Appeal>作为反序列化目标。那时它就像下面那样简单:

var firebaseLookup = JsonConvert.DeserializeObject<Dictionary<string,Appeal>>(json);
var data = firebaseLookup.Values.ToList(); // or FirstOrDefault();

如果你必须同时获得多个对象,这种方法也可以处理这种情况,并且如果事实证明密钥很重要,它将使你有机会使用该密钥。

答案 2 :(得分:0)

由于我从未能够使用newtonSoft Json解析器解析DataSnapshot,所以我这样做是为了构建需要放入ListView的对象列表:

MyModelObject类

    public class MyModelObject: Java.Lang.Object
{
    public string Title { get; set; }
    public string Description { get; set; }

    public MyModelObject(){}
}

进入我的听众

        public void OnDataChange(DataSnapshot snapshot)
    {
        List<MyModelObjecct> myList = new List<MyModelObject>();
        myList = databaseService
            .GetMyModelObjectList(snapshot
            .Children?
            .ToEnumerable<DataSnapshot>());
    }

进入DatabaseService类的方法

        public List<MyModelObject> GetMyModelObjectList(IEnumerable<DataSnapshot> enumerableSnapshot)
    {
        List<MyModelObject> list = new List<MyModelObject>();

        foreach (var item in enumerableSnapshot)
        {
            list.Add(ObjectExtensions.DataSnapshotToObject<MyModelObject>(item.Children?.ToEnumerable<DataSnapshot>()));
        }

        return list;
    }

ObjectExtensions类

      public static class ObjectExtensions
      {
        public static T DataSnapshotToObject<T>(IEnumerable<DataSnapshot> source)
        where T : class, new()
        {
        var someObject = new T();
        var someObjectType = someObject.GetType();

        foreach (var item in source)
        {
            someObjectType
                     .GetProperty(item.Key)
                     .SetValue(someObject, item.Value.ToString(), null);
        }

        return someObject;
    }
}