2016-05-11 34 views
0

Ich erhalte JSON-Daten wie folgt von einer Drittanbieter-API, die ich nicht ändern kann:Wie deserialize [[int, int, int, int, string, string], [...]] von 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]]} 

habe ich versucht, diesen Code es deserialisieren:

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

aber ich bin immer eine Ausnahme:

Kann den aktuellen JSON-Array nicht deserialisieren (zB [1,2,3]) in Typ '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] ', da der Typ ein JSON-Objekt benötigt (z. {\ "name \": \ "value \"}) um korrekt zu deserialisieren. \ r \ nUm diesen Fehler zu beheben, ändern Sie den JSON in ein JSON-Objekt (zB {\ "name \": \ "wert \"}) oder Ändern Sie den deserialisierten Typ in ein Array oder einen Typ, der eine Auflistungsschnittstelle (z. B. ICollection, IList) wie List implementiert, die aus einem JSON-Array deserialisiert werden kann. JsonArrayAttribute können auch auf die Art hinzugefügt werden, um es zu zwingen aus einer JSON-Array deserialisieren. \ R \ nPath 'Updates [0]', Zeile 1, Position 29.

Was mache ich falsch?

+0

und wenn Updates Feld ist leer (scheint wie folgt: '..." Updates ": []}') funktioniert einwandfrei – NOiSY

+0

Versuchen Sie, den Typ der Updates auf Objekt [] – Gusman

+0

wow, das funktioniert! aber wie kann ich 'object []' zu 'List >'? – NOiSY

Antwort

0

Wie von Gusman bemerkt, ist in den Kommentaren die einzige direkte Option hier das updates Feld als object[][] zu deserialisieren. Als einen ersten Schritt, der zumindest die Daten in eine Form bringt, die Sie manipulieren können.

Zum Beispiel können Sie in diese Klasse deserialisiert:

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

Von dort müssen Sie eine Möglichkeit haben, Instanzen Ihre Tuple oder eine anderen Art von diesem Arrays zu erstellen. Für den Text und die Zahlen ist die Konvertierung so einfach wie Unboxing-Werte, für den komplexen Typ ({"from":"1337"}) müssen Sie mit dem JSObject umgehen oder es wieder in JSON konvertieren und neu starten.

Nicht einfach.

Sie könnten auch eine benutzerdefinierte Deserializer-Klasse verwenden ... siehe here für einige Zeiger.