【问题标题】:Deserializing Json getting error "Cannot deserialize the current JSON array"反序列化 Json 出现错误“无法反序列化当前 JSON 数组”
【发布时间】: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 列表

标签: c# asp.net json asp.net-mvc-4


【解决方案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 中的实时代码。

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2017-04-10
    相关资源
    最近更新 更多