【问题标题】:Using JSON.net to deserialize a list of nested objects使用 JSON.net 反序列化嵌套对象列表
【发布时间】:2016-06-29 23:51:23
【问题描述】:

提前感谢您的帮助。

我有一个包含嵌套对象列表的 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。

【问题讨论】:

  • 你不需要TestCases类。它应该反序列化为一个 RootObject 对象,其中包含里面的东西

标签: c# arrays json serialization


【解决方案1】:

为什么不把 TestCases 改成一个列表呢?完美运行。

public class TestCases : List<RootObject> {}

【讨论】:

    【解决方案2】:

    或许可以试试这样简单的方法:

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

    【讨论】:

      【解决方案3】:

      这里的问题是您试图反序列化为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"));
      

      【讨论】:

      • 谢谢 Kenneth - 这就是问题所在
      【解决方案4】:

      根据指定的 json-data,你得到了一些 IEnumerable 的 RootObjects。 除了 Test002 课程外,您的课程结构良好。如果您尝试将 json-data 反序列化为 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"))
                  };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 2014-02-19
        相关资源
        最近更新 更多