使用JSON.net反序列化嵌套对象列表

时间:2016-03-14 19:10:40

标签: c# arrays json serialization

提前感谢您的帮助。

我有一个包含嵌套对象列表的JSON文件。使用下面的代码 - 我在调用DeserializeObject时遇到异常。我们正在使用JSON.net

感谢任何帮助

JSON:

[
    {
        "Email": "james@example.com",
        "Active": true,
        "CreatedDate": "2013-01-20T00:00:00Z",
        "Input": {
            "User": "Jim",
            "Admin": "John"
        },
        "Output": {
            "Version": "12345",
            "Nylon": "None"
        }
    },

        {
        "Email": "bob@example.com",
        "Active": true,
        "CreatedDate": "2013-01-21T00:00:00Z",
        "Input": {
            "User": "Bob",
            "Admin": "John"
        },
        "Output": {
            "Version": "12399",
            "Nylon": "134"
        }
    }
]

为了支持反序列化,我创建了以下类结构。

public class Test002
    {
        public class Input
        {
            public string User { get; set; }
            public string Admin { get; set; }
        }

        public class Output
        {
            public string Version { get; set; }
            public string Nylon { get; set; }
        }

        public class RootObject
        {
            public string Email { get; set; }
            public bool Active { get; set; }
            public DateTime CreatedDate { get; set; }
            public Input input { get; set; }
            public Output output { get; set; }
        }

        public class TestCases
        {
            public List<RootObject> rootObjects { get; set; }
        }

    }

最后这里是对JSON.net的调用JsonConvert.DeserializeObject - 抛出以下异常。

Test002.TestCases tTestCases = JsonConvert.DeserializeObject<Test002.TestCases>(File.ReadAllText(@"C:\test\Automation\API\Test002.json"));

我想我需要这样的东西 - 去除对象列表 - 下面的代码失败

    Test002.TestCases tTestCases = JsonConvert.DeserializeObject<IList<Test002.TestCases>>(File.ReadAllText(@"C:\test\Automation\API\Test002.json"));

例外:

Newtonsoft.Json.dll中发生了'Newtonsoft.Json.JsonSerializationException'类型的异常,但未在用户代码中处理

附加信息:无法将当前JSON数组(例如[1,2,3])反序列化为“APISolution.Test002 + TestCases”类型,因为该类型需要JSON对象(例如{“name”:“value”})正确地反序列化。

要修复此错误,请将JSON更改为JSON对象(例如{“name”:“value”})或将反序列化类型更改为数组或实现集合接口的类型(例如ICollection,IList)可以从JSON数组反序列化的列表。 JsonArrayAttribute也可以添加到类型中,以强制它从JSON数组反序列化。

路径'',第1行,第1位。

4 个答案:

答案 0 :(得分:1)

为什么不将TestCases更改为列表?效果很好。

public class TestCases : List<RootObject> {}

答案 1 :(得分:0)

也许尝试这样简单的事情:

if self.body:
    # do things

答案 2 :(得分:0)

这里的问题是您正在尝试反序列化为IListIList是一个接口,而不是具体类型,因此JSON.NET不知道要创建什么。你需要告诉它你想要的确切类型:

List<Test002.TestCases> tTestCases = JsonConvert.DeserializeObject<List<Test002.TestCases>>(File.ReadAllText(@"C:\test\Automation\API\Test002.json"));

您可以将其转换为IList:

IList<Test002.TestCases> tTestCases = JsonConvert.DeserializeObject<List<Test002.TestCases>>(File.ReadAllText(@"C:\test\Automation\API\Test002.json"));

答案 3 :(得分:0)

根据指定的json数据,你得到了一些IEnumerable的RootObjects。 除Test002课程外,您的课程组成良好。如果您尝试将json数据反序列化为List,那么一切都应该没问题。尝试像

这样的东西
var result = JsonConvert.DeserializeObject<List<RootObject>>(File.ReadAllText(@"C:\test\Automation\API\Test002.json"));

如果您非常需要Test002类的实例,则应使用

Test002.TestCases result = new TestCases(){ 
            rootObjects = JsonConvert.DeserializeObject<List<RootObject>(File.ReadAllText(@"C:\test\Automation\API\Test002.json"))
            };