Десериализация JSON, когда иногда массив, а иногда объект

У меня проблемы с десериализацией данных, возвращаемых из 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 { get; set; }

        public string Permalink { get; set; }
    }

Без использования FacebookMediaJsonConverter, я получить сообщение об ошибке: невозможно десериализовать объект JSON в тип 'System.Collections.Generic.List`1 [FacebookMedia]'. {"attachment": {"description": ""}, ...

У меня небольшие проблемы с десериализацией данных, возвращаемых из 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 { get; set; }

        public string Permalink { get; set; }
    }

Без использования FacebookMediaJsonConverter, я получить сообщение об ошибке: невозможно десериализовать объект JSON в тип 'System.Collections.Generic.List`1 [FacebookMedia]'. {"attachment": {"description": ""}, ...

У меня небольшие проблемы с десериализацией данных, возвращаемых из 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 { get; set; }

        public string Permalink { get; set; }
    }

Без использования FacebookMediaJsonConverter, я получить сообщение об ошибке: невозможно десериализовать объект JSON в тип 'System.Collections.Generic.List`1 [FacebookMedia]'. m возникла небольшая проблема с десериализацией данных, возвращаемых из 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 { get; set; }

        public string Permalink { get; set; }
    }

Без использования FacebookMediaJsonConverter, я получить сообщение об ошибке: невозможно десериализовать объект JSON в тип 'System.Collections.Generic.List`1 [FacebookMedia]'. m возникла небольшая проблема с десериализацией данных, возвращаемых из 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 { 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>(reader);
     else
          return null;
}

Что работает нормально, за исключением того, что теперь я получаю новое исключение:

Внутри JsonSerializerInternalReader.cs, CreateValueInternal (): Неожиданный токен при десериализации объекта: PropertyName

Значение reader.Value - «постоянная ссылка». Я ясно вижу в переключателе, что для JsonToken.PropertyName нет случая.

Что-то мне нужно сделать по-другому в моем конвертере? Спасибо за любую помощь.

47
задан Community 23 May 2017 в 10:31
поделиться