2016-06-20 12 views
2

Wie kann ich einen String in Json Objekt deserialisieren, wo das JSON-Objekt ein einzelnes oder ein Array sein kann, jetzt habe ich das, was funktioniert, aber es ist ein Hack (pseudo):C# ServiceStack JsonSerializer Deserialize

class MyObject{ 
    public string prop1 
    public string prop2; 
} 

class MyList{ 
    List<MyObject> objects {get; set; } 
} 

class Test{ 
    MyList list = JsonSerialzer.Deserialize<MyList>(str); 
    //if list is null - it can be single 
    if(list == null){ 
     MyObject myObject = JsonSerializer.Deserialize<MyObject>(str); 
     if(myObject != null) 
     list.add(myObject); 
    } 
    } 

Wie oben gezeigt, ist das Problem, dass die JSON-Zeichenfolge, die ich von einem anderen Dienst empfange, entweder einzeln oder in einer Liste sein kann. Wie geht man elegant damit um?

+2

Das Problem liegt mehr in der JSON-Nachricht sollte ein Attribut immer entweder 1 Objekt oder ein Array sein. Wenn es sich um ein Array handelt und die Ergebnismenge nur ein Ergebnis hat, sollte es immer noch in einem Array gekapselt sein, damit Sie nicht auf das Problem stoßen, das Sie haben. hier ist eine andere hohe SO beantworten aufgelistet, die Ihnen helfen könnten http://stackoverflow.com/questions/7895105/deserialize-json-with-c-sharp –

+0

Ist das nicht der Link mir genau die gleiche Sache, schickte ich habe? – user1529412

+0

Vielleicht habe ich nicht vergleichen. Aber die Antwort hier ist die richtige Antwort auf Ihre SO. –

Antwort

3

ich stark gegen die Annahme verschiedene Strukturen im gleichen Argumente raten würde, es macht Ihre Software sehr spröde und unberechenbar. Aber wenn es sich um eine Liste sein könnte können Sie nur das erste Zeichen überprüfen, ist ein [, zB:

if (str.TrimStart().StartsWith("[")) 
{ 
    MyList list = JsonSerialzer.Deserialize<MyList>(str); 
} 
else 
{ 
    MyObject myObject = JsonSerializer.Deserialize<MyObject>(str); 
} 

Bitte beachten Sie auch, dass standardmäßig serialisiert alle ServiceStack Text Serializer nur öffentliche Eigenschaften, so müssen Sie Getter hinzufügen/Setter für jede Eigenschaft, die Sie serialisiert werden sollen, zB:

class MyObject 
{ 
    public string prop1 { get; set; } 
    public string prop2 { get; set; } 
} 

class MyList 
{ 
    List<MyObject> objects { get; set; } 
} 

Ansonsten können Sie ServiceStack.Text auch so konfigurieren, öffentliche Felder mit serialisiert:

JsConfig.IncludePublicFields = true;