2013-08-09 10 views
6

jestem delegowania do API, które mogą powrócić albo 1 z 2 następujących formatów ciągów JSON:Lepszy sposób deserializacji JSON?

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

lub

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

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

muszę pobierać wyników z MessageType i próbowałem każdym razie warunek, o którym mogę myśleć, aby odczytać wyniki, ponieważ składnia lub pobieranie klucza: wartość jest różna dla każdego ciągu JSON i nie ma innych flag, które wyzwalałyby jeden lub drugi. Więc kod użyłem to:

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"]; 
} 

Który działa świetnie. Jeśli istnieje poprawny post Db, zwraca drugi JSON, który jest poprawnie przetwarzany przez instrukcję TRY, jeśli nie, generuje błąd "nie znaleziono klucza" i analizuje zwracany łańcuch w instrukcji CATCH (pierwszy przykład JSON). Oczywiście jest to okropny kod, ale nie mogę wymyślić innego sposobu, aby to zrobić, i zastanawiałem się, czy ktoś ma sugestie? (proszę?)

Thanx z góry.

+9

Gorąco polecam [Json.NET] (http://james.newtonking.com/projects/json-net.aspx) – AlliterativeAlice

+0

Miałem podobne problemy z Json.NET, nie ma sposobu, aby wiedzieć, które ciąg, który otrzymasz, dopóki go nie otrzymasz w moim przypadku. –

+0

Podczas gdy JSON.Net będzie miał te same problemy, będzie działał znacznie lepiej niż używany parser JSON. – bluetoft

Odpowiedz

1

Co powiesz na deserializację odpowiedzi na obiekt ze wszystkimi właściwościami dla każdego typu zwracanego tekstu, a następnie sprawdzanie wartości?

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

Dziękuję za pomoc. Nie jestem do końca pewien, do czego powinien się odwoływać publiczny model YourModel {get; set;} lub ResultObject ResponseResult. Za ich pomocą otrzymuję typ lub nie znaleziono przestrzeni nazw, bez nich otrzymuję MessageType 0 (API zwraca tylko wyniki od 1 do 17). Wybacz moją ignorancję, proszę o radę. –

+0

należy również znać ich strukturę danych i tworzyć dla nich klasy. – bluetoft

+0

zapomniałem wspomnieć I ustaw początkowo liczbę całkowitą na zero, więc instrukcja if najwyraźniej nie zwraca true –

Powiązane problemy