2016-05-11 7 views
0

Я получаю данные JSON вроде этого от стороннего API, который я не могу изменить:Как десериализовать [[int, int, int, int, string, string], [...]] от JSON

{"ts":1234567890,"updates":[[4,104482,8209,2000000007,1462994403,"some text","some text again",{"from":"1337"}],[80,7,0],[7,2000000007,104481],[62,76706856,7]]} 

Я попробовал этот код десериализацию его:

public class LongpollData 
{ 
    public ulong Ts { get; set; } 

    public List<Tuple<ApiEvent, int, ApiMask, ulong?, ulong?, string, string, FromInfo>> Updates { get; set; } 

    public class FromInfo 
    { 
     string From { get; set; } 
    } 

    public enum ApiEvent 
    { 
     delete = 0, 
     replace = 1, 
     setMessageFlags = 2, 
     resetMessageFlags = 3, 
     newMessage = 4, 
     readAllIn = 6, 
     readAllOut = 7, 
     friendIsOnline = 8, 
     friendIsOffline = 9, 
     chatChanged = 51, 
     userIsTyping = 61, 
     userIsTypingIn = 62, 
     userMadeCall = 70, 
     unreadMessagesCount = 80, 
     notificationSettingsChanged = 144, 
    } 

    [Flags] 
    public enum ApiMask 
    { 
     UNREAD = 1, 
     OUTBOX = 2, 
     REPLIED = 4, 
     IMPORTANT = 8, 
     CHAT = 16, 
     FRIENDS = 32, 
     SPAM = 64, 
     DELЕTЕD = 128, 
     FIXED = 256, 
     MEDIA = 512, 
    } 
} 

... 
var UpdateData = JsonConvert.DeserializeObject<LongpollData>(webData); 

, но я получаю исключение:

не может десериализации текущего массива JSON (например, [1,2,3]) в тип 'System.Tuple 8[VkKonekoBot.vkLongpollEvents+LongpollData+ApiEvent,System.Int32,VkKonekoBot.vkLongpollEvents+LongpollData+ApiMask,System.Nullable 1 [System.UInt64], System.Nullable`1 [System.UInt64], System.String, System.String, VkKonekoBot.vkLongpollEvents + LongpollData + FromInfo] ', потому что для этого типа требуется объект JSON (например, {\ "name \": \ "value \"}) для десериализации правильно. \ r \ nЧтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {\ "name \": \ "value \"}), либо измените десериализованный тип на массив или тип, который реализует интерфейс коллекции (например, ICollection, IList), например List, который можно десериализовать из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализацию из массива JSON. \ Г \ nPath 'Обновление [0], строка 1, позиция 29.

Что я делаю неправильно?

+0

и если поле Updates пустое (похоже на это: '..." updates ": []}') работает правильно – NOiSY

+0

Попробуйте изменить тип Обновления на объект [] – Gusman

+0

wow, это работает! но как я могу преобразовать 'object []' в 'List >'? – NOiSY

ответ

0

Как отметил Гусман, в комментариях единственным прямым вариантом здесь является десериализация поля updates как object[][]. В качестве первого шага, который по крайней мере получает данные в форму, вы можете манипулировать.

Например, вы можете десериализации в этот класс:

class temp 
{ 
    public long ts; 
    public object[][] updates; 
} 

Оттуда вам нужно будет иметь какой-то способ, чтобы создать экземпляры вашего Tuple или какой-либо другой тип из этих массивов. Для текста и чисел преобразование так же просто, как и значения для распаковки, для сложного типа ({"from":"1337"}) вам нужно иметь дело с JSObject или преобразовать его обратно в JSON и начать заново.

Не простой.

Вы также можете использовать собственный класс десериализатора ... см. here для некоторых указателей.

Смежные вопросы