8

So far, I've only been passing javascript strings to my web methods, which get parsed, usually as Guids. but now i have a method that accepts an IList... on the client, i build this array of objects and then attempt to pass it like:

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

The post:

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

The error response:

Invalid JSON primitive: object.

For some reason, jquery doesn't seem to convert my array into a json string? Any ideas why? I tried putting [] around the backerEntries, and {}, as well as {[]} just in sheer desperation. Am I missing something obvious here?

Herb Caudill
  • 50,043
  • 39
  • 124
  • 173
EvilSyn
  • 2,412
  • 7
  • 24
  • 22

4 Answers4

10

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

..is the same as

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

...which is pretty much useless. Use Duncan's suggestion if you just want to pass an encoded list of values with the name "backerEntries" in your querystring. If you want to JSON-encode the data, then get a JSON library and call JSON.stringify().

Community
  • 1
  • 1
Shog9
  • 156,901
  • 35
  • 231
  • 235
  • Thanks Shog9.. that is what I googled and already started to implement. Unfortunately, my list isn't just alist of strings, it is a list of custom objects.. so thats why I guess jquery doesn't json string it. – EvilSyn Oct 31 '08 at 23:47
  • Worked without a hitch. I'm surprised jquery doesn't have that built in! – EvilSyn Oct 31 '08 at 23:51
  • 1
    jQuery doesn't provide serialization services. Since you're using ASP.NET already, rather than add a new library you should use the built-in serialization routines that you get for free with the ASP.NET ajax framework (see my response below). – Herb Caudill Nov 01 '08 at 22:16
4

The data you are passing you are trying to pass it as a string already. If you want jQuery to transform it leave the whole thing as an object, e.g.

data:{backerEntries: backerEntries }

Assuming of course backerEntries is an array. jQuery should transform this and will append it to the querystring as that is its default behaviour. Your current code is relying on default JavaScript behaviour which won't by default convert an array into its string representation.

Duncan
  • 2,493
  • 2
  • 17
  • 13
2

Since you're using ASP.NET, you can use the built-in ASP.NET AJAX serialization library:

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

then pass that directly in your jQuery ajax call:

...
data: backerEntriesJson,
...
Herb Caudill
  • 50,043
  • 39
  • 124
  • 173
-2

This is NOT valid JSON: { 'foo': 'bar' }

Isn't, wasn't ever, never will be. JSON processors are often very forgiving, which of course is a false convenience.

Read the specification. A string is defined to be enclosed in double quotes, not single quotes, not smiley face characters, not pieces of metal bent at right angles, not bricks. There's no mention of single quotes, period.

Now, property names are JSON strings. By definition, they MUST are enclosed in double quotes.

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

see www.json.org

see www.jsonlint.com

  • This is a fine red-marker correction, but are you able to answer the question at all? – Eli Dec 11 '09 at 20:00