反序列化 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
类没有任何其他数据或行为,您可以简单地反序列化MyArray
的List
:
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 中的实时代码。
【讨论】:
以上是关于反序列化 Json 出现错误“无法反序列化当前 JSON 数组”的主要内容,如果未能解决你的问题,请参考以下文章
使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
C# Json反序列化 数据协定类型 无法反序列化 由于未找到必需的数据成员