使用 JSON.NET 反序列化 OData V2 阵列

本文关键字:V2 阵列 OData 反序列化 JSON NET 使用 | 更新日期: 2024-11-07 19:27:51

我正在尝试使用 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.NET 反序列化 OData V2 阵列

使用您提供的 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 在注释中发现的问题。