c#Json.net反序列化List <dictionary <string,object>&gt; </dictionary <string,object>

时间:2013-04-09 02:08:59

标签: c# json.net

反序列化此JSON字符串的正确方法是什么?它只是一个字典数组,其中每个字典都有一个“标题”和“孩子”,其中孩子是另一组字典。

我将其用作TreeView项目源,但树视图仅显示Title1&gt; Child1,因为我假设我正在做的反序列化有问题。我也尝试打印出Child1的第一个孩子,但无法弄明白该怎么做。下面的代码有一个无效的强制转换异常。

s = @"[{""title"":""Title1"",""children"":[{""title"":""Child1"",""children"":[{""title"":""grandchild1"",""children"":[{""title"":""Huh""}]}] }] }]";

List<Dictionary<string, object>> marr = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(s);
mTreeView.ItemsSource = marr;

List<Dictionary<string,object>> cs = (List<Dictionary<string,object>>)marr[0]["children"];
Debug.WriteLine(cs[0]["title"]);

3 个答案:

答案 0 :(得分:2)

在我看来,你有以下几点:

class MyObject
{
    public string title { get; set; }
    public List<MyObject> children { get; set; }
}

var deserialized = JsonConvert.DeserializeObject<List<MyObject>>(s);

不,这里没有字典,因为:

  • 尽我所能,我不会在这里看到一个“字典”,就像上面对象的递归列表一样,
  • 这是你想要的对象的实际定义,所以你可以利用拥有真实类型的所有好处,而不仅仅是字符串字典。

注意解决您的意见:如果JSON字符串发生更改,则不会破坏您的代码;将忽略无关属性,并且将缺少的属性正确设置为null。

答案 1 :(得分:1)

https://codetitans.codeplex.com/

codetitans JSON支持将JSON正确解析为基元的数组/字典,如下所示:

JSonReader jr = new JSonReader();
IJSonObject json = jr.ReadAsJSonObject(s);
Debug.WriteLine(json[0]["children"][0]["title"]);

据我所知,它是唯一的C#库。

答案 2 :(得分:0)

看起来您可以使用JSON.NET开箱即用

var @object = JsonConvert.DeserializeObject(s)
var slightlyMoreUsefulObject = (JArray)@object;

var actualObject = slightlyMoreUsefulObject[0]

var topLevelTitle = actualObject["title"]

var children = actualObject["children"]
var firstChild = children[0]
var firstChildTitle = firstChild["title"]