jquery json до рядка?


79

Замість того, щоб переходити з рядка json і використовувати $ .parseJSON, мені потрібно взяти свій об'єкт і зберегти його у змінній як рядок, що представляє json.

(Бібліотека, з якою я маю справу, очікує неправильного формату json, тому мені потрібно возитися з ним, щоб він запрацював.)

Який найкращий спосіб це зробити?


1
можливий дублікат серіалізації до JSON у jQuery
Wolph

Яка бібліотека очікує неправильно сформований рядок JSON? : /
Марсель Корпель

Стенфордська бібліотека криптографії JavaScript виводить та аналізує неправильний формат JSON, на даний момент над помилкою працює.
Інкогніто

Відповіді:


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/


23
Я б рекомендував бібліотеку json2.js замість цієї функції, оскільки вона не працює належним чином з деякими типами, такими як властивості, що містять undefinedфункції (які не є дійсними значеннями JSON), логічні об'єкти (наприклад new Boolean(true);) або NaNякі слід замінити з null, тощо ... також він не підтримує додаткові необов'язкові аргументи, 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 :

Параметр замінника може бути функцією або масивом Рядок / Числа. Він проходить через кожен член в об’єкті JSON, щоб дозволити вам вирішити, на яке значення слід змінити кожного члена. Як функція вона може повернути:

  • Число, рядок або логічне значення, яке замінює початкове значення властивості на повернене.
  • Об'єкт, який серіалізується, а потім повертається. Об'єктні методи або функції заборонені, а замість них видаляються.
  • Нуль, що призводить до видалення властивості.

Як масив, значення, визначені всередині нього, відповідають іменам властивостей всередині об’єкта JSON, які слід зберігати при перетворенні в об’єкт JSON.


10

Найкращий спосіб, який я знайшов, - це використовувати jQuery JSON


1
тому що це плагін jquery , а не те, що безпосередньо надається jquery
Раджат Гупта

@ user01, але jquery не містить способу зробити це (принаймні, ні, коли я писав цю відповідь, не впевнений, що так зараз)
Девід Рейнольдс,

@DavidReynolds: так, звичайно, я розумію :) Я не мав на Вас жодної образи, а просто прокоментував це як вирішення проблеми :)
Раджат Гупта,

0

Ви можете проаналізувати JSON на об'єкт, а потім створити неправильно сформований JSON з об'єкта ajavscript. Це може бути не найкращим показником продуктивності, Тхо.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.