反序列化 Json 出现错误 "Cannot deserialize the current JSON array"

Deserializing Json getting error "Cannot deserialize the current JSON array"

我正在使用以下代码反序列化 Json。

public class MyArray
        {
            public int RequestID { get; set; }
            public int Status { get; set; }
            public string ResponseMessage { get; set; }
        }
    
        public class Root
        {
            public List<MyArray> MyArray { get; set; }
        }
   var rawJson = "[{\"RequestID\":12345,\"Status\":100,\"ResponseMessage\": \"API Call Successful\"}]";

 var myDeserializedClass1 = JsonConvert.DeserializeObject<Root>(rawJson); 

我遇到了以下错误。它没有填充 My Array。 关于这里出了什么问题的任何想法。

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'xyz.Root' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.

更新基于 OP

根据您对问题的最新编辑,您有一个数组 MyArray。因此,您应该使用 MyArray 的集合进行反序列化。

例如,

 var myDeserializedClass1 = JsonConvert.DeserializeObject<MyArray[]>(rawJson); 
// OR
 var myDeserializedClass1 = JsonConvert.DeserializeObject<IEnumerable<MyArray>>(rawJson); 

基于编辑前的原始问题

您正在尝试使用错误的对象类型 (Root) 进行反序列化,这就是反序列化失败的原因,并且 returns 一个空值。

您的 Json 包含 MyArray 的单个实例,而不是 Root 的实例。您需要反序列化使用

var myDeserializedClass1 = JsonConvert.DeserializeObject<MyArray>(rawJson); 

这将为您提供所需的结果。

您的 JSON 根本不包含数组。 JSON 数组通常以 [ 开头并以 ].

结尾

因此,要么将 JSON 更改为:

[
  {
    "RequestID": 12345,
    "Status": 100,
    "ResponseMessage": "API Call Successful"
  }
]

或者像这样立即反序列化为 MyArray 对象:

var deserializedObject = JsonConvert.DeserializeObject<MyArray>(json); 

如果你想让它反序列化为 Root 对象,'rawJson' 应该是这样的:

var rawJson = "{\"MyArray\":[{\"RequestID\":12345,\"Status\":100,\"ResponseMessage\": \"API Call Successful\"}]}";

顺便说一下,如果您的 Root class 没有任何其他数据或行为,您可以简单地反序列化 MyArrayList:

var rawJson = "[{\"RequestID\":12345,\"Status\":100,\"ResponseMessage\": \"API Call Successful\"}]";
 var myDeserializedObject = JsonConvert.DeserializeObject<List<MyArray>>(rawJson); 

在上面的代码中,myDeserializedObject是List类型。您还可以将其反序列化为任何集合,例如 MyArray[]IList<MyArray> 或可枚举的 IEnumerable<MyArray>.

看看我创建的 dot net fiddle file 中的实时代码。