【问题标题】:Deserialize JSON object with null arrays using newtonsoft.json使用 newtonsoft.json 反序列化带有空数组的 JSON 对象
【发布时间】:2018-02-14 01:18:26
【问题描述】:

我正在访问一个返回类似 JSON 的响应的 Web 服务,并且我正在尝试反序列化对 C# 对象的响应。我使用 Visual Studio Edit > Paste Special > Paste JSON as Classes 方法来创建类的基本版本。当我尝试使用以下方法反序列化对这些类的 Web 服务响应时(其中 rawResp 是来自 Web 服务的文本响应)

var results = JsonConvert.DeserializeObject<List<ApplyEditsResult>>(rawResp);

我收到以下错误消息:

无法反序列化当前 JSON 对象(例如 {"name":"value"}) 进入类型“Rid20Api.Models.ApplyEditsResult+Result”,因为类型 需要一个 JSON 数组(例如 [1,2,3])才能正确反序列化。修理 此错误将 JSON 更改为 JSON 数组(例如 [1,2,3])或 更改反序列化类型,使其成为普通的 .NET 类型(例如 不是像整数这样的原始类型,不是像数组这样的集合类型 或列表)可以从 JSON 对象反序列化。 JsonObjectAttribute 也可以添加到类型中以强制它 从 JSON 对象反序列化。路径'[0].addResults[0].objectId', 第 1 行,位置 35。

我尝试将“JsonObject”属性添加到适当的类;添加了 JsonArray 属性也是如此。我缺少什么来正确反序列化响应?

来自网络服务的响应:

[
  {
    "id": 0,
    "addResults": [
      {
        "objectId": 1215,
        "globalId": "{5a3d5c49-856c-4de4-9d20-c7abf0e070c8}",
        "success": true
      }
    ],
    "attachments": {
      "addResults": [],
      "deleteResults": [],
      "updateResults": []
    }
  },
  {
    "id": 2,
    "addResults": [
      {
        "objectId": 819,
        "globalId": "{459f456a-c115-4f9c-b1f9-d754d55980dd}",
        "success": true
      },
      {
        "objectId": 820,
        "globalId": "{f690cded-2ffb-4301-ab6e-58ae9733eeba}",
        "success": true
      }
    ]
  }
]

和类(无论类是嵌套的还是“独立的”,都没有任何区别):

    public class ApplyEditsResult
    {

        public int id { get; set; }
        public Result[] addResults { get; set; }
        public Result[] updateResults { get; set; }
        public Result[] attachments { get; set; }

        [JsonObject]
        public class Attachments
        {
            [JsonProperty("addResults")]
            public object[] addResults { get; set; }
            [JsonProperty("deleteResults")]
            public object[] deleteResults { get; set; }
            [JsonProperty("updateResults")]
            public object[] updateResults { get; set; }
        }

        [JsonArray(AllowNullItems = true)]
        [JsonObject]
        public class Result
        {
            public bool success { get; set; }
            public Error error { get; set; }
            public int objectId { get; set; }
            public string globalId { get; set; }
        }

        [JsonObject]
        public class Error
        {
            public int code { get; set; }
            public string description { get; set; }
        }

    }

编辑...... 这是 VS 工具创建的未经编辑的类集合。如上所述以及在下面的 cmets 中,我更改了其中一些类 1) 以更好地适应我的代码(包括来自服务的错误响应)和 2) 尝试自己纠正错误(失败)。

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public int id { get; set; }
    public Addresult[] addResults { get; set; }
    public Attachments attachments { get; set; }
}

public class Attachments
{
    public object[] addResults { get; set; }
    public object[] deleteResults { get; set; }
    public object[] updateResults { get; set; }
}

public class Addresult
{
    public int objectId { get; set; }
    public string globalId { get; set; }
    public bool success { get; set; }
}

【问题讨论】:

  • 你不需要在 Result 类之上的 [JsonArray(AllowNullItems = true)]
  • 公共结果[] addResults { get;放; } 公共结果 [] 更新结果 { 获取;放; } 公共结果 [] 附件 { 获取;放; } 所有对象具有相同的返回类型。它不会解析。 Json 架构应该类似于类层次结构
  • VS 没有创建这些类 - 您缺少应该包含 AddResult 列表、附件对象和 int 的 RootObject
  • @Plutonix - 我确实使用 VS 来创建类。我删除了“RootObject”,因为来自 Web 服务的响应没有 JSON 的“根”(相反,它只返回一个数组)。我的错误是将“AddResult”类的名称更改为“Result”。试图将该类用作添加、删除和更新的通用“结果”。这并不顺利。
  • ApplyEditsResult 根对象。没有一个机器人工具将相关类型作为嵌套类。

标签: c# json json.net deserialization


【解决方案1】:

你的班级应该是这样的

public class AddResult
{

    [JsonProperty("objectId")]
    public int objectId { get; set; }

    [JsonProperty("globalId")]
    public string globalId { get; set; }

    [JsonProperty("success")]
    public bool success { get; set; }
}

public class Attachments
{

    [JsonProperty("addResults")]
    public List<object> addResults { get; set; }

    [JsonProperty("deleteResults")]
    public List<object> deleteResults { get; set; }

    [JsonProperty("updateResults")]
    public List<object> updateResults { get; set; }
}

public class ApplyEditsResult
{

    [JsonProperty("id")]
    public int id { get; set; }

    [JsonProperty("addResults")]
    public List<AddResult> addResults { get; set; }

    [JsonProperty("attachments")]
    public Attachments attachments { get; set; }
}

然后

var results = JsonConvert.DeserializeObject<List<ApplyEditsResult>>(rawResp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2015-05-14
    • 2016-05-23
    • 2018-02-10
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多