Сообщение jQuery не отправляет правильный JSON [дубликат]

Математическая математика с плавающей запятой такова. В большинстве языков программирования он основан на стандарте IEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с Java double. Суть проблемы состоит в том, что числа представлены в этом формате как целое число раз в два раза; рациональные числа (такие как 0.1, который является 1/10), знаменатель которого не является степенью двух, не могут быть точно представлены.

Для 0.1 в стандартном формате binary64 представление может записывается в точности как

  • 0.1000000000000000055511151231257827021181583404541015625 в десятичной форме или
  • 0x1.999999999999ap-4 в нотации C99 hexfloat .

Напротив, рациональное число 0.1, которое является 1/10, может быть записано точно как

  • 0.1 в десятичной форме или
  • 0x1.99999999999999...p-4 в аналоге обозначения гексафлоата C99, где ... представляет собой бесконечную последовательность 9.

Константы 0.2 и 0.3 в вашей программе также будут приближенными к их истинные ценности. Бывает, что ближайший double до 0.2 больше, чем рациональное число 0.2, но ближайший double до 0.3 меньше, чем рациональное число 0.3. Сумма 0.1 и 0.2 заканчивается выше, чем рациональное число 0.3 и, следовательно, не согласуется с константой в вашем коде.

Достаточно полное рассмотрение арифметических вопросов с плавающей запятой Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой . Для более простого объяснения см. floating-point-gui.de .

57
задан Michał Perłakowski 9 February 2016 в 18:44
поделиться

5 ответов

Поскольку вы не указали ни тип содержимого запроса, ни правильный запрос JSON. Вот правильный способ отправки запроса JSON:

var arr = { City: 'Moscow', Age: 25 };
$.ajax({
    url: 'Ajax.ashx',
    type: 'POST',
    data: JSON.stringify(arr),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    async: false,
    success: function(msg) {
        alert(msg);
    }
});

Замечания:

  • Использование метода JSON.stringify для преобразования объекта javascript в строку JSON который является родным и встроенным в современные браузеры. Если вы хотите поддерживать старые браузеры, вам может потребоваться включить json2.js
  • Указание типа содержимого запроса с использованием свойства contentType, чтобы указать серверу цель отправка запроса JSON
  • Свойство dataType: 'json' используется для типа ответа, который вы ожидаете от сервера. jQuery достаточно умен, чтобы угадать его из заголовка ответа сервера Content-Type. Поэтому, если у вас есть веб-сервер, который уважает более или менее HTTP-протокол и отвечает на Content-Type: application/json на ваш запрос, jQuery будет автоматически анализировать ответ в javascript-объекте в обратном вызове success, так что вам не нужно указывать Свойство dataType.

Осторожно:

  • То, что вы называете arr, не является массивом. Это объект javascript со свойствами (City и Age). Массивы обозначаются символом [] в javascript. Например, [{ City: 'Moscow', Age: 25 }, { City: 'Paris', Age: 30 }] представляет собой массив из двух объектов.
149
ответ дан Darin Dimitrov 25 August 2018 в 22:50
поделиться

Я написал небольшую удобную функцию для размещения JSON.

$.postJSON = function(url, data, success, args) {
  args = $.extend({
    url: url,
    type: 'POST',
    data: JSON.stringify(data),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    async: true,
    success: success
  }, args);
  return $.ajax(args);
};

$.postJSON('test/url', data, function(result) {
  console.log('result', result);
});
3
ответ дан Aram Kocharyan 25 August 2018 в 22:50
поделиться

Вам нужно установить правильный тип контента и подкрепить свой объект.

var arr = {City:'Moscow', Age:25};
$.ajax({
    url: "Ajax.ashx",
    type: "POST",
    data: JSON.stringify(arr),
    dataType: 'json',
    async: false,
    contentType: 'application/json; charset=utf-8',
    success: function(msg) {
        alert(msg);
    }
});
0
ответ дан locateganesh 25 August 2018 в 22:50
поделиться

Поскольку по умолчанию jQuery сериализует объекты, переданные как параметр data, на $.ajax. Он использует $.param для преобразования данных в строку запроса.

Из документов jQuery для $.ajax :

[аргумент data] преобразуется в строку запроса, если уже не строка

Если вы хотите отправить JSON, вам придется ее кодировать самостоятельно:

data: JSON.stringify(arr);

Обратите внимание, что JSON.stringify присутствует только в современных браузерах. Для устаревшей поддержки загляните в json2.js

8
ответ дан lonesomeday 25 August 2018 в 22:50
поделиться

Он сериализуется так, чтобы URI мог считывать пары значений имени в запросе POST по умолчанию. Вы можете попробовать установить processData: false в свой список параметров. Не уверен, что это поможет.

0
ответ дан picus 25 August 2018 в 22:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: