1

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

我将其用作 TreeView 项目源,但树视图仅显示 Title1 > 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"]);
4

3 回答 3

2

在我看来,您有以下内容:

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

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

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

  • 尽我所能,我在这里看不到“字典”,而是上面对象的递归列表,并且
  • 无论如何,这是您想要的对象的实际定义,因此您可以利用拥有真实类型的所有好处,而不仅仅是字符串字典。

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

于 2013-04-09T02:15:05.607 回答
1

https://codetitans.codeplex.com/

codetitans JSON 支持将 JSON 正确解析为原语数组/dict,如下所示:

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

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

于 2013-04-09T17:53:26.580 回答
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"]
于 2016-05-11T21:41:27.107 回答