使用newtonsoft.json使用空数组反序列化JSON对象

时间:2018-02-14 01:18:26

标签: c# json json.net deserialization

我正在点击一个返回类似JSON的响应的Web服务,我正在尝试反序列化对C#对象的响应。我看了Visual Studio Edit>选择性粘贴>将JSON粘贴为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类型(例如   不是像整数这样的原始类型,不是像数组那样的集合类型   或者List)可以从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工具创建的未编辑的类集合。如上所述,在下面的评论中,我改变了其中一些类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; }
}

1 个答案:

答案 0 :(得分: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);