2013-08-09 12 views
6

ich an eine API bin Entsendung, die zurückkehren kann entweder 1 der folgenden zwei Formate von JSON-Strings:Eine bessere Möglichkeit, JSON zu deserialisieren?

{ 
"MessageType": 6, 
"Message": "Unable to SAVE new record. Invalid posted data." 
} 

oder

{ 
"Model": { 
    "Id": "1-6Q0RZ9", 
    ... 

     }, 
"ResponseResult": { 
    "MessageType": 10, 
    "Message": "Successfully saved, Record Id = 1-6Q0RZ9" 
        } 
} 

Ich brauche die Ergebnisse von Message abrufen und haben versucht, alle, wenn Bedingung, die ich mir vorstellen kann, um die Ergebnisse zu lesen, da die Syntax oder das Abrufen des Schlüssel: Wert für jede JSON-Zeichenfolge unterschiedlich ist und wenn keine anderen Flags das eine oder das andere auslösen. Also der Code, den ich verwendete, ist:

string result = eml.PostData("API/Save", dataJSON.ToString()); 
var returnresult = new JavaScriptSerializer().Deserialize<dynamic>(result); 
try { 
    var responseresults = returnresult["ResponseResult"]; 
    rr = responseresults["MessageType"]; 
    rrtxt = responseresults["Message"]; 
} catch (Exception ex) { 
    rr = returnresult["MessageType"]; 
    rrtxt = returnresult["Message"]; 
} 

Was funktioniert gut. Wenn es ein gültiges Db-Post gibt, gibt es das zweite JSON zurück, das von der TRY-Anweisung korrekt analysiert wird, andernfalls löst es einen "Schlüssel nicht gefunden" -Fehler aus und analysiert die zurückgegebene Zeichenfolge in der CATCH-Anweisung (das erste JSON-Beispiel). Offensichtlich ist das ein schrecklicher Code, aber ich kann mir keinen anderen Weg vorstellen, und ich fragte mich, ob jemand Vorschläge hatte. (bitte?)

Vielen Dank im Voraus.

+9

I [Json.NET] wird dringend empfohlen (http://james.newtonking.com/projects/json-net.aspx) – AlliterativeAlice

+0

ich mit JSON.Net ähnliche Probleme hatte, gibt es keine Möglichkeit, das zu wissen String, den Sie bekommen, bis Sie es in meinem Fall haben. –

+0

Während JSON.Net die gleichen Probleme hat, ist es viel besser als der JSON-Parser, den Sie verwenden. – bluetoft

Antwort

1

Wie ist es, die Antwort auf ein Objekt mit allen Eigenschaften für jeden Rückgabetyp deserialisieren und dann nur die Werte überprüfen?

public class ReturnObject 
{ 
    public YourModel Model {get;set;} 
    public ResultObject ResponseResult {get;set;} 
    public int? MessageType {get;set;} 
    public string Message {get;set;} 
} 


string result = eml.PostData("API/Save", dataJSON.ToString()); 
var returnresult = new JavaScriptSerializer().Deserialize<ReturnObject>(result); 
{ 
    if(returnresult.MessageType.HasValue) 
    { 
    var messageType = returnResult.MessageType.Value; 
    etc etc. 
    } 

} 
+0

Danke für die Hilfe. Ich bin mir nicht sicher, worauf das öffentliche YourModel Model {get; set;} oder das ResultObject ResponseResult referenzieren soll. Mit ihnen bekomme ich Typ oder Namespace nicht gefunden, ohne sie bekomme ich einen MessageType von 0 (die API liefert nur Ergebnisse von 1 bis 17). Entschuldige meine Unwissenheit, bitte rate. –

+0

Sie müssen auch ihre Datenstruktur kennen und Klassen für sie erstellen. – bluetoft

+0

vergessen zu erwähnen, ich setze die Return-Integer zunächst auf Null, so dass die If-Anweisung scheinbar nicht zurückgibt –

Verwandte Themen