使用JSON.NET反序列化OData V2数组

时间:2015-03-10 11:05:46

标签: c# json json.net deserialization odata

我正在尝试使用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 ()
        {
        }
    }
}

提前致谢!

1 个答案:

答案 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; }
}

使用这些类,然后可以使用代码

反序列化给定的JSON
using (JsonReader reader = new JsonTextReader(new StringReader(inputText)))
{
  JsonSerializer seri = new JsonSerializer();
  ODataResponse output = seri.Deserialize(reader, typeof(ODataResponse)) as ODataResponse;
}

定义的类解决了注释中GrawCube和RLH识别的问题。