2009-05-14 14 views
2

Ich versuche, mit JSON eine Hashtabelle an meinen Webservice zu senden. Sie können jedoch aus irgendeinem Grund kein wörterbuchartiges Objekt senden.Wie schicke ich eine Hashtabelle an einen asmx Webservice?

Eine Lösung, die anscheinend funktioniert, ist "List (Of KeyValuePair (Of String, String))", als Ausgang sowieso:

<WebMethod()> _ 
Public Function test() As List(Of KeyValuePair(Of String, String)) 
    Dim ret As New List(Of KeyValuePair(Of String, String)) 
    ret.Add(New KeyValuePair(Of String, String)("foo", "5")) 
    ret.Add(New KeyValuePair(Of String, String)("bar", "baz")) 
    Return ret 
End Function 

Ausgänge (in json): [{ "Key": "foo" "Value", "5"}, { "Key": "bar", "Wert": "baz"}]

Wenn ich dies in Javascript erneut einreichen will, muss ich diese Funktion nutzen:

<WebMethod()> _ 
Public Sub test2(ByVal obj As List(Of KeyValuePair(Of String, String))) 
    Dim dummy As UInt16 = obj.Count 
End Sub 

Ich nenne es mit diesem als JSON-Parameter-String:

'{"obj": [{"Key":"foo","Value":"5"},{"Key":"bar","Value":"baz"}]}' 

Dies gibt einen Fehler zurück. Kein Fehler per se, aber der Inhalt von 'obj' ist eine Liste, die 2 Elemente enthält, aber wenn ich sie im Debugger anschaue, sind beide Nothing (oder null für C# Leute).

Wie kann ich gepaarte Daten von Javascript an meinen Webservice senden?

Antwort

0

try this ...

'{"obj": {"foo":"5","bar":"baz"}}' 
+0

Funktioniert nicht in Kombination mit der Liste (von KeyValuePair()). Brauche ich einen anderen Objekttyp? – Tominator

+0

IIRC Dictionary passt ziemlich gut in MVC, nicht so vertraut mit dem Service-Aufruf, oder wie Dinge weitergegeben werden ... zitiert nicht die Zeichenfolge Arbeit? Es tut mir leid, dass ich hier ein bisschen vage bin, nur mit JS vertrauter als die Kommunikation, oder was im Kommunikationskanal kodiert wird. – Tracker1

+0

Ich hatte das umgekehrte Problem - eine Hashtabelle im JSON-Format von MVC zurückgeben - und es war einfach wie Dictionary zurückgeben. Ziemlich großartig eigentlich. –

1

Wenn Sie test2 ändern, um eine Liste der Dictionary-Objekten zu erhalten, ich glaube, Sie gut sein zu gehen.

<WebMethod()> _ 
Public Sub test2(ByVal obj As List(Of Dictionary(Of String, String))) 
    Dim dummy As UInt16 = obj.Count 
End Sub 
0

[Partial Antwort]: Ich hatte ein ähnliches Problem, und am Ende mit dieser JSON-Bibliothek (http://www.json.org/js.html) und die JSON.stringify (yourJSONObj) ein Objekt zurück zu meinem Dienst zu senden.

Mein Problem hatte damit zu tun, dass JSON mein Objekt nicht richtig erkannte. Es wurde angenommen, dass einige meiner Eigenschaftsnamen JSON-Primitive waren. Durch Verwendung dieses Aufrufs (JSON.stringify()) wurde dieses Problem behoben.

Man könnte so etwas wie tun:

var data = JSON.stringify('{"obj": [{"Key":"foo","Value":"5"},{"Key":"bar","Value":"baz"}]}' 
); 

Und dann das Datenobjekt zu Ihrem ASMX-Dienst senden.

0

Wenn Sie einen Webservice von .Net aufrufen und Daten im JSON-Format übergeben müssen, sollten Sie JayRock (http://jayrock.berlios.de/) verwenden, um Dinge in JSON zu konvertieren. Verweisen Sie einfach auf die DLL, importieren Sie den Namensraum, erstellen Sie ein JsonObject, füllen Sie es mit Zeug und exportieren Sie es in eine Zeichenfolge. Hier ist ein Beispiel

 

Imports Jayrock.Json 
Imports Jayrock.Json.Conversion 

Public Function foo(hsh As HashTable) As String 

    Dim jObj As New JsonObject() 

    jObj.Put("_myHashTable", hsh) 

    Return JsonConvert.ExportToString(jObj) 

End Sub 

 

Wenn Sie Daten aus dem DOM zu einem Webservice über AJAX bringen, er die Javascript-Bibliothek von json.org wie oben erwähnt verwenden würde. Sie können einen JSON-String auch mit JayRock in ein JsonObject umwandeln.

Verwandte Themen