2008-10-31 1 views
8

Bis jetzt habe ich JavaScript-Strings nur an meine Webmethoden übergeben, die geparst werden, normalerweise als Guids. aber jetzt habe ich eine Methode, die eine IList akzeptiert ... auf dem Client, ich baue dieses Array von Objekten und dann versuchen, es passieren mag:Warum macht jquery mein Array nicht zu einer JSON-Zeichenfolge, bevor es an die ASP.net-Webmethode gesendet wird?

$.ajax({ 
    type: 'POST', 
    url: 'personalization.aspx/SetPersonalization', 
    data: "{'backerEntries':" + backerEntries + "}", 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    success: postcardManager.SetPersonalizationComplete 
}); 

Der Beitrag:

{'backerEntries':[object Object],[object Object],[object Object]} 

Der Fehler Antwort:

Invalid JSON primitive: object. 

Aus irgendeinem Grund scheint jquery mein Array nicht in eine JSON-Zeichenfolge zu konvertieren? Irgendwelche Ideen warum? Ich habe versucht, [] um die BackerEntries und {}, sowie um [[]} nur aus reiner Verzweiflung herumzulegen. Fehle ich etwas Offensichtliches hier?

Antwort

10

Daten: "{ 'backerEntries':" + backerEntries + "}",

..ist das gleiche wie

data: "{'backerEntries':" + backerEntries.toString() + "}", 

... was ziemlich nutzlos ist. Verwenden Sie den Vorschlag von Duncan, wenn Sie nur eine codierte Liste von Werten mit dem Namen "backerEntries" in Ihrer Abfragezeichenfolge übergeben möchten. Wenn Sie die Daten JSON-codieren möchten, rufen Sie a JSON library und rufen Sie JSON.stringify().

+0

Dank Shog9 .. das ist, was ich gegoogelt und bereits damit begonnen, zu implementieren. Leider besteht meine Liste nicht nur aus Strings, sondern aus einer Liste von benutzerdefinierten Objekten. Deshalb denke ich, dass jQuery keine String-Einträge enthält. – EvilSyn

+0

Arbeitete ohne Probleme. Ich bin überrascht, dass jquery das nicht eingebaut hat! – EvilSyn

+1

jQuery bietet keine Serialisierungsdienste. Da Sie bereits ASP.NET verwenden und keine neue Bibliothek hinzufügen, sollten Sie die integrierten Serialisierungsroutinen verwenden, die Sie kostenlos mit dem ASP.NET AJAX-Framework erhalten (siehe meine Antwort unten). –

4

Die Daten, die Sie übergeben, versuchen, sie bereits als Zeichenfolge zu übergeben. Wenn Sie möchten, dass jQuery es transformiert, lassen Sie das Ganze als ein Objekt, z.

data:{backerEntries: backerEntries } 

Angenommen backerEntries ist natürlich ein Array. jQuery sollte dies transformieren und an die Querystring anhängen, da dies das Standardverhalten ist. Ihr aktueller Code basiert auf dem Standard-JavaScript-Verhalten, das ein Array standardmäßig nicht in seine Zeichenfolgendarstellung konvertiert.

2

Da Sie ASP.NET verwenden, können Sie mit dem integrierten ASP.NET AJAX Serialisierung Bibliothek:

var backerEntriesJson = Sys.Serialization.JavaScriptSerializer.serialize(backerEntries); 

dass dann in Ihren Anruf jQuery Ajax direkt übergeben:

... 
data: backerEntriesJson, 
... 
-2

Dies ist NICHT gültig JSON: {'foo': 'bar'}

Ist nicht, war nie, wird nie sein. JSON-Prozessoren sind oft sehr fehlerverzeihend, was natürlich eine falsche Bequemlichkeit ist.

Lesen Sie die Spezifikation. Ein String ist so definiert, dass er in doppelte Anführungszeichen eingeschlossen ist, keine einfachen Anführungszeichen, keine Smiley-Zeichen, keine rechtwinklig gebogenen Metallstücke, keine Steine. Es gibt keine Anführungszeichen, Punkt.

Nun sind Eigenschaftsnamen JSON-Zeichenfolgen. Per Definition sind sie in Anführungszeichen eingeschlossen.

Valid: { "foo": "bar"} valid "{ "foo": 100} gilt: { "foo": true} gilt: { "foo": [ "one"," two "]," bar ": false}

siehe www.json.org

siehe www.jsonlint.com

+0

Dies ist eine feine Rot-Marker-Korrektur, aber können Sie die Frage überhaupt beantworten? – Eli

Verwandte Themen