3 Stimmen

JsonConvert.DeserializeObject und "d"-Wrapper in WCF

Standardmäßig WCF Service wrap JSON-Antwort in "d" Wrapper und dort fand ich ein Problem mit Parsing es.

Wenn ich parse mit JsonConvert.DeserializeObject(Antwort) wobei die Antwort

"{\"d\":\"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}\"}"

I gor an Error:

After parsing a value an unexpected character was encoutered: a. Line 1, position 9.

Wenn ich die Antwort in

"{\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\":\"Thelma\",\"d56d4d4f-6029-40df-a23b-de27617a1e43\":\"Louise\"}"

Ich habe es zum Laufen gebracht.

Also, wie diese "d" verpackt JSON-Antworten von WCF-Dienste zu parsen? Gibt es eine bessere Möglichkeit, JSON zu parsen?

11voto

JeremyWeir Punkte 23702

Ich nehme an, Sie verwenden <enableWebScript/> in Ihrer Verhaltenskonfiguration, ersetzen Sie diese durch <webHttp defaultOutgoingResponseFormat="Json"/> und Sie erhalten ein schönes und sauberes json, kein "d" und kein "__type"

0 Stimmen

Wenn Sie die <enableWebScript/> Sie werden nicht in der Lage sein, den Dienst über eine Ajax-Anfrage in Jquery aufzurufen

2voto

nitzmahone Punkte 13384

Sieht aus wie Sie das enableWebScript Verhalten auf Ihre webHttpBinding verwenden. Sie sollten wahrscheinlich das webHttp-Verhalten stattdessen verwenden - dies gibt Ihnen "sauber" JSON anstelle der ASP.NET AJAX-Client JSON.

0 Stimmen

Ich habe versucht, dies zu ändern, aber dann bekam ich eine Fehlermeldung: Die Operation 'Speichern' des Vertrags 'Organisation' gibt mehrere Parameter des Anforderungskörpers an, die ohne Wrapper-Elemente serialisiert werden sollen. Maximal ein Body-Parameter kann ohne Wrapper-Elemente serialisiert werden. Entfernen Sie entweder die zusätzlichen Body-Parameter oder setzen Sie die BodyStyle-Eigenschaft des WebGetAttribute/WebInvokeAttribute auf Wrapped. Meine Save-Methode sieht wie folgt aus: [OperationContract] bool Save(string orgGuid, string orgName, string orgCode, string orgAddress, int orgStatus) Ansonsten ist dieser "d"-Wrapper OK, aber warum erzeugt er beim Parsen einen Fehler?

1voto

zax Punkte 794

Nehmen Sie Ihr json und fügen Sie es in einen Online-Klassengenerator ein, z. B. http://httputility.net/json-to-csharp-vb-typescript-class.aspx . Es wird Ihnen den Code zur Verfügung stellen, um dieses json-Objekt zu deserialisieren, wie dieses (VB-Beispiel):

Public Class MyClass
     Public Property D As String
End Class

Fügen Sie dies in Ihr Projekt ein und deserialisieren Sie das json in dieses Objekt. Die D-Eigenschaft ist jetzt eine Zeichenkette, die das entpackte json enthält, das Sie ein zweites Mal in Ihr endgültiges Empfangsobjekt deserialisieren müssen. Wenn Sie sich nicht sicher sind, welche Klasse Sie dafür benötigen, fügen Sie die Zeichenkette in D in denselben Online-Klassengenerator ein, und schon haben Sie den erforderlichen Code, um den Typ für den Empfang des Objekts zu erstellen!

0voto

AnzeR Punkte 590

Jetzt habe ich loszuwerden "d" Wrapper mit Regex.Replace und fix JSON Antwort mit der richtigen Struktur

{\"Guid\":\"a0b70d2f-7fe4-4aa2-b600-066201eab82d\",\"Name\":\"Thelma\"}
{\"Guid\":\"d56d4d4f-6029-40df-a23b-de27617a1e43\",\"Name\":\"Lousie\"}\"}

Ich mache auch eine Klasse mit Guid und Name, definiert als String in ihr.

Versuchen Sie dann, die Datei mit

List<myStruct> o = JsonConvert.DeserializeObject<List<myStruct>>(response);

Aber ich erhalte eine Fehlermeldung

Expected a JsonObjectContract or JsonDictionaryContract for type 'System.Collections.Generic.List`1[mynamespace.myStruct]', got 'Newtonsoft.Json.Serialization.JsonArrayContract'.

Wo ist der Trick?

0 Stimmen

Ich prüfe Beispiele auf james.newtonking.com/projects/json-net.aspx . OK, das alles funktioniert gut, wenn Sie nur einen Datensatz in der JSON-Zeichenfolge haben, aber wenn Sie mehr davon haben...

0 Stimmen

Was sind Sie deserializing zu? können wir mystruct sehen?

0voto

krisragh MSFT Punkte 1908

Wenn Sie zu WebHttpBehavior wechseln und immer noch eine Fehlermeldung darüber erhalten, dass die Body-Elemente nicht umhüllt werden, setzen Sie den Body-Stil der Methoden, mit denen Sie arbeiten, manuell auf Wrapped. Gehen Sie wie folgt vor:

[OperationContract(BodyStyle = WebMessageBodyStyle.Wrapped, ...)] string DoSomething(...)

Ich hoffe, das hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X