JSON newtonsoft反序列化

时间:2018-12-13 05:15:05

标签: c# arrays json.net deserialization

我必须解析以下格式的Web API。请注意,我无法更改JSON的格式。它将始终以以下格式出现:

{
    "somethingone": "abc",
    "somethingtwo": "abcde-1234",
    "information": {
        "report": [{
                "a": "1",
                "b": "2",
                "c": "3"
            },
            {
                "a1": "1a",
                "b2": "2a",
                "c3": "3a"
            }, {
                "a1": "1b",
                "b2": "2b",
                "c3": "3b"
            },
        ]
    }
}

当我尝试在Newtonsoft中解析它时,出现以下错误消息:

  

由于将(例如{“ name”:“ value”})转换为type,因此无法反序列化当前json对象,因为该类型需要json数组(例如[1,2,3])才能正确反序列化。

几天来我一直在努力解决此问题,但无法解决。

2 个答案:

答案 0 :(得分:1)

在此问题中,您可能将json解析为类列表,例如List<ClassName>,则应排除List <>,因为传入的json中只有一个主对象

答案 1 :(得分:0)

如果您的report数组中的项不是固定的,则意味着这些项的计数从1到N,则声明每个项的属性很困难,并且您的类对象结构变得繁琐。

因此,您需要收集Dictionary中的所有项目,以便它可以分析从1到N的项目。

这些类对象适合您的json。

class RootObj
{
    public string somethingone { get; set; }
    public string somethingtwo { get; set; }
    public Information information { get; set; }
}

class Information
{
    public Dictionary<string, string>[] report { get; set; }
}

您可以反序列化

RootObj mainObj = JsonConvert.DeserializeObject<RootObj>(json);

Console.WriteLine("somethingone: " + mainObj.somethingone);
Console.WriteLine("somethingtwo: " + mainObj.somethingtwo);

foreach (Dictionary<string, string> report in mainObj.information.report)
{
    foreach (KeyValuePair<string, string> item in report)
    {
         string key = item.Key;
         string value = item.Value;

         Console.WriteLine(key + ": " + value);
    }
}

Console.ReadLine();

输出:

enter image description here

Live Demo