Почему jquery не превращает мой массив в строку json перед отправкой в asp.net веб-метод?

до сих пор я передавал строки javascript только своим веб-методам, которые анализируются, как правило, как GUID. но теперь у меня есть метод, который принимает IList... на клиенте я создаю этот массив объектов, а затем пытаются передать его как:

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

должность:

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

ответ об ошибке:

Invalid JSON primitive: object.

по какой-то причине jquery не преобразует мой массив в строку json? Есть идеи почему? Я попытался положить [] вокруг backerEntries, и {}, а также {[]} просто в полном отчаянии. Я упускаю что-то очевидное?

4 ответов


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

..это то же самое, что

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

...что практически бесполезно. Использовать Дунканпредложение, если вы просто хотите передать закодированный список значений с именем "backerEntries" в строке запроса. Если вы хотите JSON-кодировать данные, то получите библиотека JSON и звонок JSON.stringify().


данные, которые вы передаете, вы уже пытаетесь передать их как строку. Если вы хотите, чтобы jQuery преобразовал его, оставьте все это как объект, например

data:{backerEntries: backerEntries }

предполагая, конечно, что backerEntries является массивом. jQuery должен преобразовать это и добавит его к querystring, поскольку это его поведение по умолчанию. Ваш текущий код полагается на поведение JavaScript по умолчанию, которое по умолчанию не преобразует массив в его строковое представление.


Так как вы используете ASP.NET, вы можете использовать встроенный ASP.NET библиотека сериализации AJAX:

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

затем передайте это непосредственно в вызове jQuery ajax:

...
data: backerEntriesJson,
...

Это недопустимо JSON: {'foo': 'bar'}

Нет, никогда не было, никогда не будет. Процессоры JSON часто очень прощают, что, конечно, является ложным удобством.

читать спецификацию. Строка определяется как заключенная в двойные кавычки, а не одинарные кавычки, не смайлики, не куски металла, изогнутые под прямым углом, не кирпичи. Там нет упоминания о одинарных кавычках, точка.

теперь имена свойств являются строками JSON. По определению, они должны быть заключены в двойные кавычки.

действительно: {"foo": "bar" } действительно " {"foo": 100 } действительно: {"foo": true } valid: {"foo": ["one", "two"], "bar": false }

см www.json.org

см www.jsonlint.com