jquery json в строку?

79

Вместо того, чтобы переходить от строки json и использовать $ .parseJSON, мне нужно взять свой объект и сохранить его в переменной как строку, представляющую json.

(Библиотека, с которой я имею дело, ожидает искаженного типа json, поэтому мне нужно повозиться с ним, чтобы заставить его работать.)

Как лучше всего это сделать?

Инкогнито
источник
1
возможный дубликат сериализации в JSON в jQuery
Вольф
Какая библиотека ожидает искаженной строки JSON? : /
Марсель Корпель
Стэнфордская библиотека криптографии JavaScript выводит и анализирует искаженный JSON, ошибка исправлена ​​на данный момент.
Incognito,

Ответы:

84

Изменить: вы должны использовать библиотеку json2.js от Дугласа Крокфорда вместо реализации кода ниже. Он предоставляет некоторые дополнительные функции и лучшую / более старую поддержку браузера.

Возьмите файл json2.js по адресу: https://github.com/douglascrockford/JSON-js


// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    }
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        }
        return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
    }
};

var tmp = {one: 1, two: "2"};
JSON.stringify(tmp); // '{"one":1,"two":"2"}'

Код с: http://www.sitepoint.com/blogs/2009/08/19/javascript-json-serialization/

Inigoesdr
источник
23
Я бы порекомендовал библиотеку json2.js вместо этой функции, потому что она некорректно обрабатывает некоторые типы, такие как свойства, содержащие undefined, функции (которые не являются допустимыми значениями JSON), логические объекты (например new Boolean(true);) или NaNкоторые следует заменить with null, etc ... также он не поддерживает дополнительные необязательные аргументы, replacerфункцию и spacesчисло для отступа, которые полностью описаны в стандарте.
Кристиан С. Сальвадо,
3
я думаю, что, возможно, ссылка json2 должна быть: github.com/douglascrockford/JSON-js/blob/master/json2.js
fisherwebdev
5
В наши дни большинство браузеров имеют собственный объект JSON, который включает методы синтаксического анализа и преобразования строк. Так что просто попробуйте JSON.stringify({})и посмотрите, получится ли у вас "{}"без необходимости включать приведенный выше код. Вы даже можете передать параметры, чтобы отфильтровать ключи или сделать красивую печать, например, поставить JSON.stringify({a:1,b:2}, null, 2)новую строку и 2 пробела перед каждой клавишей.
AlexChaffee
Для тех, кто ищет современный ответ: JSON.stringify (); реализовано во всех браузерах (настольных и мобильных): developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Пабло Мартинес
38

я использую

$.param(jsonObj)

что дает мне строку.

Джонатан
источник
8
Но это не создает JSON (и это был вопрос).
Феликс Клинг,
22
но этот небольшой код выполняет все заголовки запросов вопросов: P
nils petersohn
35

В JSONнаши дни у большинства браузеров есть собственный объект, который включает в себя parseи stringifyметоды. Так что просто попробуйте JSON.stringify({})и посмотрите, получится ли у вас "{}". Вы даже можете передать параметры, чтобы отфильтровать ключи или сделать красивую печать, например, поставить JSON.stringify({a:1,b:2}, null, 2)новую строку и 2 пробела перед каждой клавишей.

JSON.stringify({a:1,b:2}, null, 2)

дает

"{\n  \"a\": 1,\n  \"b\": 2\n}"

который печатается как

{
  "a": 1,
  "b": 2
}

Что касается беспорядочной части вашего вопроса, используйте второй параметр. С http://www.javascriptkit.com/jsref/json.shtml :

Параметр replacer может быть функцией или массивом String / Numbers. Он проходит через каждого члена в объекте JSON, чтобы вы могли решить, на какое значение следует изменить каждый член. В качестве функции он может возвращать:

  • Число, строка или логическое значение, заменяющее исходное значение свойства возвращенным.
  • Объект, который затем сериализуется, возвращается. Методы или функции объекта не разрешены и вместо этого удаляются.
  • Null, что приводит к удалению свойства.

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

AlexChaffee
источник
10

Лучший способ, который я нашел, - использовать jQuery JSON.

Дэвид Рейнольдс
источник
1
потому что это плагин jquery, а не то, что напрямую предоставляется jquery,
Раджат Гупта,
@ user01, но jquery не включает способ сделать это (по крайней мере, этого не было, когда я писал этот ответ, не уверен, есть ли сейчас)
Дэвид Рейнольдс
@DavidReynolds: да, конечно, я понимаю :) Я не собирался обижать вас, а просто прокомментировал это как решение проблемы :)
Раджат Гупта
0

Вы можете преобразовать JSON в объект, а затем создать искаженный JSON из объекта ajavscript. Возможно, это не лучшая производительность.

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

cofiem
источник