我正在尝试使用Newtonsoft JSON.NET从OData V2服务反序列化以下响应。
但是我得到以下例外:
无法反序列化当前的JSON对象(例如{“name”:“value”}) 进入类型'Newtonsoft.Json.TestConsole.City []'因为类型 需要一个JSON数组(例如[1,2,3])才能正确反序列化。修理 此错误要么将JSON更改为JSON数组(例如[1,2,3])或 更改反序列化类型,使其成为正常的.NET类型(例如 不是像整数这样的原始类型,不是像数组那样的集合类型 或者List)可以从JSON对象反序列化。 JsonObjectAttribute也可以添加到类型中以强制它 从JSON对象反序列化。路径'Cities.results',第6行, 第12位。
在我看来,我需要在反序列化之前转换respone并删除结果标记。
你有什么想法我能做到吗?
这是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 ()
{
}
}
}
提前致谢!
答案 0 :(得分:1)
使用您提供的JSON示例并使用"粘贴JSON作为类"在VS2012的功能,我得到了以下类(我删除了_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; }
}
使用这些类,然后可以使用代码
反序列化给定的JSONusing (JsonReader reader = new JsonTextReader(new StringReader(inputText)))
{
JsonSerializer seri = new JsonSerializer();
ODataResponse output = seri.Deserialize(reader, typeof(ODataResponse)) as ODataResponse;
}
定义的类解决了注释中GrawCube和RLH识别的问题。