我正在使用以下调用从JSON中读取对象列表:
Rootobject userInfo = JsonConvert.DeserializeObject<Rootobject>(File.ReadAllText(strFileName));
但是我遇到了一个异常
无法反序列化当前的JSON数组
。如果类对象中的一个数组为空,那么就会出现这种情况。 只要有数据,一切都正常。以下是导致反序列化器出现问题的JSON示例:
这是Venue对象的正常数据类型:
"venue": {
"venue_id": 696895,
"venue_name": "Blackfinn Ameripub",
"venue_slug": "blackfinn-ameripub",
"primary_category": "Food",
"parent_category_id": "4d4b7105d754a06374d81259",
"categories": {
"count": 1,
"items": [
{
"category_name": "American Restaurant",
"category_id": "4bf58dd8d48988d14e941735",
"is_primary": true
}
]
},
"is_verified": false
},
以下是引起异常的原因,一个空数组:
"venue": [
],
我尝试使用JsonSerializerSettings选项,包括DefaultValueHandling、NullValueHandling和MissingMemberHandling,但似乎没有一个可以防止错误的发生。
有什么办法可以反序列化JSON并忽略数据中的任何空数组? 我希望这个方法不仅适用于上面示例中的对象Venue,而且适用于所有空数组。
“新问题已发现 - 03/17/2018 <<”
嗨,下面的转换器一直工作得很完美,但我从中获取JSON响应的服务器又提出了另一个挑战。JSON.NET检索这种类型的数据没有问题:
"toasts": {
"total_count": 1,
"count": 1,
"auth_toast": false,
"items": [
{
"uid": 3250810,
"user": {
"uid": 3250810,
"account_type": "user",
"venue_details": [
],
"brewery_details": [
]
},
"like_id": 485242625,
"like_owner": false,
"created_at": "Wed, 07 Mar 2018 07:54:38 +0000"
}
]
},
具体来说,需要翻译的内容是关于IT技术的,涉及到venue_details这一部分。99%的响应都以以下格式返回venue_details信息:
"venue_details": [
],
但是突然间我得到了这个格式:
"toasts": {
"total_count": 1,
"count": 1,
"auth_toast": false,
"items": [
{
"uid": 4765742,
"user": {
"uid": 4765742,
"account_type": "venue",
"venue_details": {
"venue_id": 4759473
},
"brewery_details": [
],
"user_link": "https://untappd.com/venue/4759473"
},
"like_id": 488655942,
"like_owner": false,
"created_at": "Fri, 16 Mar 2018 16:47:10 +0000"
}
]
},
注意,现在venue_details有一个值并包含一个venue_id。
因此,venue_details最终看起来像一个对象而不是一个数组。这会导致出现以下异常:
JsonSerializationException:无法将当前JSON对象(例如{"name":"value"})反序列化为类型'System.Collections.Generic.List`1[System.Object]',因为该类型需要一个JSON数组(例如[1,2,3])才能正确反序列化。
在提供的转换器代码中,该异常发生在这一行上,带有*的标记:
public abstract class IgnoreUnexpectedArraysConverterBase : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var contract = serializer.ContractResolver.ResolveContract(objectType);
if (!(contract is JsonObjectContract))
{
throw new JsonSerializationException(string.Format("{0} is not a JSON object", objectType));
}
do
{
if (reader.TokenType == JsonToken.Null)
return null;
else if (reader.TokenType == JsonToken.Comment)
continue;
else if (reader.TokenType == JsonToken.StartArray)
{
var array = JArray.Load(reader);
if (array.Count > 0)
throw new JsonSerializationException(string.Format("Array was not empty."));
return existingValue ?? contract.DefaultCreator();
}
else if (reader.TokenType == JsonToken.StartObject)
{
// Prevent infinite recursion by using Populate()
existingValue = existingValue ?? contract.DefaultCreator();
*** serializer.Populate(reader, existingValue); ***
return existingValue;
有什么想法可以添加额外的处理来解决JSON返回对象而不是数组的翻转问题吗?
谢谢, Rick