无法将JSON数组反序列化为类型foo

Ash*_*Ash 5 serialization json json.net

我试图使用JSON.NET lib解析来自oodle.com api feed的数据.要反序列化的响应JSON字符串的一部分具有以下"位置"结构:

"location":{
"address":"123 foo Street",
"zip":"94102",
"citycode":"usa:ca:sanfrancisco:downtown",
"name":"San Francisco (Downtown)",
"state":"CA",
"country":"USA",
"latitude":"37.7878",
"longitude":"-122.4101"},
Run Code Online (Sandbox Code Playgroud)

但是我已经看到位置声明为空数组的实例:

"location":[],
Run Code Online (Sandbox Code Playgroud)

我试图在类型位置数据类中反序列化它.当位置具有有效数据时,这非常有效,但当位置表示为空数组时,它不能很好地工作.我尝试添加属性(NullValueHandling和Required)以将位置实例设置为null,如果数据确实是一个空数组但我认为这些属性仅用于序列化.如果数组为空,我会得到一个例外

Cannot deserialize JSON array into type 'LocationData'
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉反序列化器不要抱怨并且如果反序列化失败的数组使位置对象为null?谢谢!

[JsonProperty(NullValueHandling = NullValueHandling.Ignore,Required=Required.AllowNull)]
public LocationData location{get;set;}
    ...
public class LocationData  
     {
          public string zip { get; set; }
          public string address { get; set; }
          public string citycode { get; set; }
          public string name { get; set; }
          public string state { get; set; }
          public string country { get; set; }
          public decimal latitude { get; set; }
          public decimal longitude { get; set; }
     }
Run Code Online (Sandbox Code Playgroud)

Pau*_*yng 2

您可以为该LocationData类型编写一个自定义转换器,以将数组标记转换为 null。

就像是:

public class LocationDataConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                reader.Read(); //move to end array
                return null;
            }

            var data = new LocationData();
            serializer.Populate(reader, data);

            return data;
        }
}
Run Code Online (Sandbox Code Playgroud)

然后只需标记 LocationData 类:

[JsonConverter(typeof(LocationDataConverter))]
public class LocationData {...}
Run Code Online (Sandbox Code Playgroud)