在 C# 中,我如何反序列化此 json?

In C#, how can i deserialize this json?

我正在从如下所示的 REST 服务中获取此 JSON 数据:

[ [ [ {"Name": "Joe", "Comment": "Load", "Updated": null, "Test": ""} ] ] ]

[ [ [ {"Name": "Joe", "Comment": "Load", "Updated": null, "Test": ""}, {"Name": "Bill", "Comment": "123", "Updated": null, "Test": ""} ] ] ]

我在 visual studio 中做了一个 "Copy JSON as classes" 功能,它创建了这个:

 public class Rootobject
 {
     public Project[][][] Property1 { get; set; }
 }

 public class Project
 {
   public string Name { get; set; }
   public string Comment { get; set; }
   public string Updated { get; set; }
   public string Test { get; set; }
 }

但是当我尝试使用此代码反序列化时:

 var results = new JsonDeserializer().Deserialize<Rootobject>(response);

我收到一条错误消息:

RestSharp.dll 中发生类型 'System.InvalidCastException' 的异常,但未在用户代码中处理 附加信息:无法将类型 'RestSharp.JsonArray' 的对象转换为类型 'System.Collections.Generic.IDictionary`2[System.String,System.Object]'

能否请您告知我可能做错了什么(注意:我无法控制数据的输入方式,因此无法更改格式)

此外,为了确认这似乎是有效的 JSON 来自 JSONLlint:

使用 Newtonsoft.Json nuget 包, 尝试

JSONConvert.DeserialiseObject<Rootobject>(response)

编辑:顺便说一句,我尝试在 http://json2csharp.com/ 上使用您的 json,它说 解析您的 JSON 无效。请确保它是有效的。 所以我怀疑任何 json 解析库是否能够解析您的 JSON。

然而,当外部服务 return 无效 JSON

时,实现您自己的反序列化器是可能的并且是理想的解决方案

如果你告诉我当服务 return 多个 Project 对象时你得到什么 JSON,我可能可以帮助你反序列化它。

EDIT2:Szabolcs 的解决方案似乎很有前途,但我仍然建议使用 JSON 对多个 Product 对象进行测试。我闻到了难闻的味道,这是糟糕的第三方服务。总是很好测试。

您可以像这样反序列化特定的 JSON 使用 Json.NET:

var json = "[ [ [ {\"Name\": \"Joe\", \"Comment\": \"Load\", \"Updated\": null, \"Test\": \"\"}, "+ 
                " {\"Name\": \"Bill\", \"Comment\": \"123\", \"Updated\": null, \"Test\": \"\"} ] ] ]";

var deserializedObject = JsonConvert.DeserializeObject<List<List<List<Project>>>>(json);

并从嵌套列表中获取所有 Project

var allProjects = deserializedObject.SelectMany(x => x.SelectMany(y => y)).ToList();