反序列化firebase的响应

时间:2014-07-24 17:47:25

标签: c# json list deserialization firebase

我正在使用c#通过提供的REST api与Firebase进行交互。

当我向节点发送GET请求时,我会按预期获得子节点。

{
    "49d360b0-b3a8-4240-bd69-1f91b07365fd" : {
        "id" : "49d360b0-b3a8-4240-bd69-1f91b07365fd",
        "name" : "Foo",
        "value" : "Love me some foo"
    },
    "8b87b4df-9c04-480b-bb53-43e22059ccfa" : {
        "id" : "8b87b4df-9c04-480b-bb53-43e22059ccfa",
        "name" : "Bar",
        "value" : "Yay, bar"
    },
    "966fe014-08c3-4f64-93a3-7bd8ed396177" : {
        "id" : "966fe014-08c3-4f64-93a3-7bd8ed396177",
        "name" : "Name",
        "value" : "Text"
    }
}

可以有任意数量的孩子。在得到答复之后我才知道有多少。我试图将这个反序列化为List,尽管任何类型的IEnumerable应该没问题,因为它可以很容易地转换为列表。我的Entry类看起来像这样:

public class Entry
{
    public string id { get; set; }

    public string name { get; set; }

    public string value { get; set; }
}

如何进行反序列化?我一直在使用Newtonsoft进行大多数JSON处理,我是否需要使用不同的库?

更新:在进行调用之前,JSON中对象的名称也是未知的,因此涉及按索引获取值的解决方案不会非常有用

2 个答案:

答案 0 :(得分:6)

你走了(有点难看):

public class Item
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

和反序列化代码:

dynamic data = JsonConvert.DeserializeObject<dynamic>(jsonString);
var list = new List<Item>();
foreach (var itemDynamic in data)
{
    list.Add(JsonConvert.DeserializeObject<Item>(((JProperty)itemDynamic).Value.ToString()));
}

我跳过原版json中的Guid Id - 你需要它们吗?我会更新我的答案 修改
Linq版本稍短:

dynamic data = JsonConvert.DeserializeObject<dynamic>(jsonString);
var shorter = ((IDictionary<string, JToken>)data).Select(k => 
    JsonConvert.DeserializeObject<Item>(k.Value.ToString())).ToList();

答案 1 :(得分:3)

您还可以将结果序列化为这样的词典:

Dictionary<string, Entry> entryDict = JsonConvert.DeserializeObject<Dictionary<string, Entry>>(jsonString);

然后如果你想要一个条目列表:

List<Entry> entries = entryDict.Select(x => x.Value).ToList();