在C#中从Firebase反序列化JSON对象

本文关键字:JSON 对象 反序列化 Firebase 中从 | 更新日期: 2023-09-27 18:27:14

我正在查询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")。如果需要的话,我可以更改对象定义。我觉得字典会很有用。

在C#中从Firebase反序列化JSON对象

快速而肮脏的对象是使用Dictionary<string,Appeal>作为反序列化目标。在这一点上,它将非常简单:

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

如果你必须同时获得多个对象,这种方法也可以处理这种情况,如果最终证明密钥很重要,它将为你提供使用该密钥的机会。

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

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));

由于我从未能够使用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>());
    }

数据库服务类的方法

        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;
    }
}