【问题标题】:Deserialize response from firebase反序列化来自 Firebase 的响应
【发布时间】:2014-09-16 09:57:02
【问题描述】:

我正在使用 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"
    }
}

可以有任意数量的孩子。直到收到回复后才知道有多少。我试图将其反序列化为一个列表,尽管任何类型的 IEnumerable 都应该没问题,因为它可以很容易地转换为一个列表。我的 Entry 类如下所示:

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

    public string name { get; set; }

    public string value { get; set; }
}

如何进行反序列化?我一直在使用 Newtonsoft 处理大部分 JSON,我需要使用其他库吗?

更新:在调用之前,JSON 中的对象名称也是未知的,因此涉及通过索引获取值的解决方案不会很有帮助

【问题讨论】:

  • 看看这个解决方案 - stackoverflow.com/a/8738149/2571926.
  • 谢谢,这让我开始朝着正确的方向前进。虽然这让我意识到更大的问题是我事先不知道字段名称是什么。
  • 你至少需要知道数据的类型,以及它们有哪些字段才能处理它。否则,您将变得如此通用,以至于您的代码将难以遵循和调试。

标签: c# json list deserialization firebase


【解决方案1】:

给你(有点丑):

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

【讨论】:

  • 不,原始json中的id与object中的id相同。所以,跳过它很好。感谢您的帮助!
【解决方案2】:

您还可以像这样将结果反序列化为字典:

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

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

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

【讨论】:

  • 你的解决方案是最好的!
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多