我正在尝试使用 Newtonsoft JSON.NET 反序列化来自 OData V2 服务的以下响应。
但是,我收到以下异常:
无法反序列化当前 JSON 对象(例如 {"名称":"值"}) 类型为"Newtonsoft.Json.TestConsole.City[]",因为类型 需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。要修复 此错误将 JSON 更改为 JSON 数组(例如 [1,2,3])或 更改反序列化类型,使其成为普通的 .NET 类型(例如 不是像整数这样的基元类型,不是像数组这样的集合类型 或列表),可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制其 从 JSON 对象反序列化。路径"城市结果",第 6 行, 位置 12。
在我看来,我需要在反序列化之前转换响应并删除结果令牌。
你有什么想法我怎么能做到这一点吗?
这是 OData V2 响应:
{
"__metadata":{
"uri":"https://www.myuri.com",
"type":"OdataWebServiceExample.Countrys"
},
"Name":"usa",
"Cities":{
"results":[
{
"__metadata":{
"uri":"https://www.myuri.com",
"type":"OdataWebServiceExample.Citys"
},
"Name":"new york",
"Persons":{
"results":[
{
"__metadata":{
"uri":"https://www.myuri.com",
"type":"OdataWebServiceExample.Persons"
},
"Name":"joe dalton"
},
{
"__metadata":{
"uri":"https://www.myuri.com",
"type":"OdataWebServiceExample.Persons"
},
"Name":"jack dalton"
}
]
}
}
]
}
}
这是相应的 C# 类:
using System;
using System.Runtime.Serialization;
namespace Newtonsoft.Json.TestConsole
{
[DataContract (Name="Countrys")]
public class Country
{
[DataMember (Name = "Name")]
public string Name { get; set;}
[DataMember (Name = "Cities")]
public City[] Cities { get; set;}
public Country ()
{
}
}
[DataContract (Name="Citys")]
public class City
{
[DataMember (Name = "Name")]
public string Name { get; set;}
[DataMember (Name = "Persons")]
public Person[] Persons { get; set;}
public City ()
{
}
}
[DataContract (Name="Persons")]
public class Person
{
[DataMember (Name = "Name")]
public string Name { get; set;}
public Person ()
{
}
}
}
提前感谢!
使用您提供的 JSON 示例并使用 VS2012 中的"将 JSON 粘贴为类"功能,我得到了以下类(我删除了_metadata部分,因为您似乎没有使用它们并且可以忽略)
public class ODataResponse
{
public string Name { get; set; }
public Cities Cities { get; set; }
}
public class Cities
{
public City[] results { get; set; }
}
public class City
{
public string Name { get; set; }
public Persons Persons { get; set; }
}
public class Persons
{
public Person[] results { get; set; }
}
public class Person
{
public string Name { get; set; }
}
使用这些类,您可以使用代码反序列化给定的 JSON
using (JsonReader reader = new JsonTextReader(new StringReader(inputText)))
{
JsonSerializer seri = new JsonSerializer();
ODataResponse output = seri.Deserialize(reader, typeof(ODataResponse)) as ODataResponse;
}
定义的类解决了 GrawCube 和 RLH 在注释中发现的问题。