反序列化 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 没有任何其他数据或行为,您可以简单地反序列化 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。
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 没有任何其他数据或行为,您可以简单地反序列化 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 中的实时代码。