首页 文章

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

提问于
浏览
-1

我正在点击一个返回类似JSON的响应的Web服务,我正在尝试反序列化对C#对象的响应 . 我使用Visual Studio编辑>选择性粘贴>粘贴JSON作为类方法来创建类的基本版本 . 当我尝试使用下面的方法反序列化对这些类的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对象反序列化的数组或List . JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化 . 路径'[0] .addResults [0] .objectId',第1行,第35位 .

我尝试将“JsonObject”属性添加到适当的类中;还添加了JsonArray属性 . 我错过了正确反序列化响应的内容?

来自Web服务的响应:

[
  {
    "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; }
        }

    }

EDIT .........这是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 回答

  • 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);
    

相关问题