反序列化来自firebase的响应
本文关键字:响应 firebase 反序列化 | 更新日期: 2023-09-27 18:14:34
我使用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都可以,因为它可以很容易地转换为List。我的Entry类看起来像这样:
public class Entry
{
public string id { get; set; }
public string name { get; set; }
public string value { get; set; }
}
如何进行反序列化?我一直在使用Newtonsoft的大部分JSON处理,我需要使用不同的库吗?
更新:在调用之前,JSON中对象的名称也是未知的,因此涉及通过索引获取值的解决方案不会非常有用
给你(有点丑):
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();
还可以将结果反序列化为Dictionary,如下所示:
Dictionary<string, Entry> entryDict = JsonConvert.DeserializeObject<Dictionary<string, Entry>>(jsonString);
,然后如果你想要一个条目列表:
List<Entry> entries = entryDict.Select(x => x.Value).ToList();