У меня возникли проблемы с десериализацией данных, возвращаемых из Facebook с использованием библиотек JSON.NET.
JSON, вернувшийся из простого сообщения на стене, выглядит так:
{
"attachment":{"description":""},
"permalink":"http://www.facebook.com/permalink.php?story_fbid=123456789"
}
JSON, возвращенный для фотографии, выглядит следующим образом:
"attachment":{
"media":[
{
"href":"http://www.facebook.com/photo.php?fbid=12345",
"alt":"",
"type":"photo",
"src":"http://photos-b.ak.fbcdn.net/hphotos-ak-ash1/12345_s.jpg",
"photo":{"aid":"1234","pid":"1234","fbid":"1234","owner":"1234","index":"12","width":"720","height":"482"}}
],
Все отлично работает, и у меня нет проблем. Теперь я наткнулся на простую запись на стене от мобильного клиента со следующим JSON, и десериализация теперь не удалась с этой единственной записью:
"attachment":
{
"media":{},
"name":"",
"caption":"",
"description":"",
"properties":{},
"icon":"http://www.facebook.com/images/icons/mobile_app.gif",
"fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"
Вот класс, который я десериализую как:
public class FacebookAttachment
{
public string Name { get; set; }
public string Description { get; set; }
public string Href { get; set; }
public FacebookPostType Fb_Object_Type { get; set; }
public string Fb_Object_Id { get; set; }
[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> { get; set; }
public string Permalink { get; set; }
}
Не используя FacebookMediaJsonConverter, я получаю сообщение об ошибке: Невозможно десериализовать объект JSON в тип 'System.Collections.Generic.List`1 [FacebookMedia]'.
что имеет смысл, так как в JSON Media не является коллекцией.
Я нашел этот пост, в котором описана похожая проблема, поэтому я попытался пойти по этому пути: Десериализовать JSON, иногда значение - это массив, иногда "" (пустая строка)
Мой конвертер выглядит так:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
return serializer.Deserialize<List<FacebookMedia>>(reader);
else
return null;
}
Что отлично работает, за исключением того, что теперь я получаю новое исключение:
Внутри JsonSerializerInternalReader.cs, CreateValueInternal (): неожиданный токен при десериализации объекта: PropertyName
Значение читателя. Значение - «постоянная ссылка». Я ясно вижу в переключателе, что JsonToken.PropertyName не подходит.
Что-то мне нужно сделать по-другому в моем конвертере? Спасибо за любую помощь.