2014-07-24 41 views
3

我正在使用c#通过提供的REST API与Firebase进行交互。反序列化来自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都应该没问题,因为它可以轻松地转换为列表。我的入门级看起来像这样:

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

    public string name { get; set; } 

    public string value { get; set; } 
} 

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

UPDATE:在JSON对象的名称也进行调用之前未知的,所以通过指数涉及获取值的解决方案将不会是超级有用

+0

看看这个解决方案 - http:///stackoverflow.com/a/8738149/2571926。 –

+0

谢谢,这让我开始朝着正确的方向发展。尽管这让我意识到一个更大的问题是我不知道字段名是什么。 –

+0

您至少需要知道数据的类型以及它们处理数据的字段。否则,你会变得非常通用,以至于你的代码很难被跟踪和调试。 – krillgar

回答

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

我跳过该GUID标识的原始JSON - 你需要他们吗?我会更新我的答案。
编辑:
短一点的LINQ版本:

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

不,原始json中的id与对象中的id相同。所以,跳过它很好。谢谢您的帮助! –

+0

很高兴它! –

+0

它为我工作。 :) –

3

你也deseriealize结果的解释是这样的:

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

,然后如果你想项的列表:

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