Невозможно десериализовать массив JSON в тип foo - PullRequest
5 голосов
/ 11 сентября 2010

Я пытаюсь проанализировать данные из фида API oodle.com, используя библиотеку JSON.NET.Часть ответной строки JSON для десериализации имеет следующую структуру 'location':

"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"},

, однако я видел экземпляры location, объявленные как пустой массив:

"location":[],

Япытаясь десериализовать его в классе типа Location Data.Это прекрасно работает, когда в локации есть действительные данные, но не очень хорошо, когда локация представлена ​​в виде пустого массива.Я попытался добавить атрибуты (NullValueHandling & Required), чтобы установить экземпляр местоположения как ноль, если данные действительно являются пустым массивом, но я думаю, что эти атрибуты предназначены только для сериализации.Если массив пуст, я получаю исключение

Cannot deserialize JSON array into type 'LocationData'

Есть ли способ сообщить десериализатору, чтобы он не жаловался, и сделать объект местоположения пустым, если в массиве десериализация не удалась?Спасибо!

[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; }
     }

1 Ответ

2 голосов
/ 10 ноября 2011

Вы можете написать собственный конвертер для типа LocationData, чтобы превратить токены массива в ноль.

Что-то вроде:

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;
        }
}

Затем просто пометить класс LocationData:

[JsonConverter(typeof(LocationDataConverter))]
public class LocationData {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...