在 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();
我正在从如下所示的 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();