2017-11-03 1 views
-2

Ich habe die folgenden JSON, die ein unbenanntes Array und andere benannte Eigenschaften enthält. Ich würde gerne wissen, wie man es mit Newtonsoft.Json zu einer Klasse deserialisiert.Json Arry und andere Eigenschaften Deserialisierung (C#)

{ 
    "message": "success", 
    [ 
     { 
      "timestamp": 1509723862, 
      "tid": 84823616, 
      "price": "7344.7", 
      "amount": "0.36108123", 
      "exchange": "bitfinex", 
      "type": "sell" 
     }, 
     { 
      ... 
     } 
    ] 
    } 

Ich weiß, ich könnte das Array deserialisieren mit serializer.DeserializeObject < Liste < Antwort>> (serializedObject), aber als die json andere Eigenschaften enthält, ist es kein json-Array String.

Gibt es eine Konfiguration, die ich Newtonsoft.Json sagen, verwenden könnte das Array in eine Liste deserialisieren, und die ‚Nachricht‘ Eigenschaft auf eine Zeichenfolge, in der Klasse Gebrüll:

public class Response 
{ 
    public string Message {get;set;} 
    public List<ResponseItem> ResponseItems {get;set;} 

} 

public class ResponseItem { 
    string timestamp {get;set;} 
    (...) 
} 
+3

Warum Sie ungültige JSON zu analysieren versuchen? Kannst du es nicht reparieren? – CodeCaster

+0

Ich glaube, ich habe das Problem falsch verstanden. Eigentlich gibt es mir immer einen gültigen JSON. Wenn ich https://api.bitfinex.com/v1/trades/BTCUSD frage, wird ein gültiges json-Array zurückgegeben. Wenn ich https://api.bitfinex.com/v1/trades/BTCUSDxxx anfordere, gibt es mir wieder einen gültigen JSON, aber diesmal einen anderen. Was ich versuche zu tun, ist nur eine Klasse (mit beiden Antworten). Nicht sicher, dass es möglich ist. – FelipeDrumond

+0

Das json ** ist ** ungültig, setzen Sie es in https://jsonlint.com/ und Sie werden sehen. Sie können ungültiges JSON nicht deserialisieren. Ihr erster Schritt sollte sein, den JSON zu korrigieren – Liam

Antwort

1

Ein JSON können Ich habe kein unbenanntes Array und keinen benannten Wert auf derselben Ebene. Der JSON ist ungültig. Entweder ist alles verschlüsselt, oder es ist ein Array ohne Schlüssel. Kann nicht beides haben.

0

Ich denke, es ist keine gute Idee, die beiden Json zu verbinden. Ihre eigenen Deserializer verwenden und Ihre Zweier-Json passieren:

public static class ResponseDeserializer 
{ 
    public static Response Deserialize(string psMessage, string psResponeItems) 
    { 
     dynamic loMessage = JsonConvert.DeserializeObject(psMessage); 

     return new Response() 
     { 
      Message = loMessage.message, 
      ResponseItems = JsonConvert.DeserializeObject<List<ResponseItem>>(psResponeItems) 
     }; 
    } 
} 

Und es verwenden:

string lsMessage = "{\"message\":\"Unknown symbol\"}"; 
string lsResponseItems = "[{\"timestamp\":1509726632,\"tid\":84840931,\"price\":\"7298.8\",\"amount\":\"0.0044733\",\"exchange\":\"bitfinex\",\"type\":\"sell\"},{\"timestamp\":1509726630,\"tid\":84840921,\"price\":\"7297.3\",\"amount\":\"0.11550649\",\"exchange\":\"bitfinex\",\"type\":\"sell\"},{\"timestamp\":1509726630,\"tid\":84840911,\"price\":\"7297.2\",\"amount\":\"0.0214149\",\"exchange\":\"bitfinex\",\"type\":\"buy\"},{\"timestamp\":1509726629,\"tid\":84840909,\"price\":\"7297.2\",\"amount\":\"0.41004892\",\"exchange\":\"bitfinex\",\"type\":\"buy\"}]"; 

var loResponse = ResponseDeserializer.Deserialize(lsMessage, lsResponseItems); 
Console.WriteLine(loResponse.Message); 
Verwandte Themen