反序列化 Json 出现错误“无法反序列化当前 JSON 数组”

Posted

技术标签:

【中文标题】反序列化 Json 出现错误“无法反序列化当前 JSON 数组”【英文标题】:Deserializing Json getting error "Cannot deserialize the current JSON array" 【发布时间】:2021-02-11 23:42:13 【问题描述】:

我正在使用以下代码反序列化 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.

【问题讨论】:

原始 json 只是一个元素......不是一个数组。反序列化为 MyArray,而不是 MyArray 列表 【参考方案1】:

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

所以要么你把你的 JSON 改成这样:

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

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

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

【讨论】:

[] 这个以前有,我删了。我现在已经编辑了问题。请检查。【参考方案2】:

根据 OP 的变化更新

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

例如,

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

基于编辑前的原始问题

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

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

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

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

【讨论】:

感谢您的回答,它是这样工作的。请重新检查问题,我已经做了一些修改。【参考方案3】:

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

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

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

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

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

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

【讨论】:

以上是关于反序列化 Json 出现错误“无法反序列化当前 JSON 数组”的主要内容,如果未能解决你的问题,请参考以下文章

使用JSON.net进行反序列化时出错

使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性

C# Json反序列化 数据协定类型 无法反序列化 由于未找到必需的数据成员

在 C# 中反序列化复杂对象

在flutter中使用json_serializable对json对象进行反序列化

为啥JSON字符串当中会出现反斜杠?