JSON stringify відсутній у jQuery 1.4.1?


74

Очевидно, jQuery має можливість декодувати даний об'єкт або рядок в об'єкт JSON. Однак у мене є об'єкт JS, який мені потрібно POST повернути на сервер, і я не знаходжу жодної утиліти в jQuery, яка обгортає функцію JSON.stringify (). Цю функцію можна знайти в Chrome, Safari 4, FF3.6 та IE8, але її немає в попередніх браузерах. Я можу використовувати його в браузерах, які його підтримують, але в іншому випадку я змушений повернутися до використання сценаріїв JSON Крокфорда.

Чи є якась вбудована функція jQuery, яка обробляє кодування та декодування JSON замість сценаріїв Крокфорда?


3
Схожі повідомлення: stackoverflow.com/questions/191881 / ...
sberry

Можливо, я справді німий, але це теж було для мене повною несподіванкою. Схоже, сценарій JSON.org - це шлях.
KevinM

Відповіді:


29

Ви можете перевірити це: http://www.json.org/js.html


10
Так, сумно, що jQuery не додав метод, щоб зробити це безпосередньо в бібліотеці. Я закінчив мініфікуванням json.js за допомогою компілятора Закриття та закріпив його внизу мого js-файлу, де я працюю. Це зробить трюк, але здається непотрібним.
Geuis

я використовую рішення code.google.com/p/jquery-json . Для мене чудово працює.
crsuarezf

Посилання більше не функціонує. Ця відповідь насправді не дає відповіді, оскільки це лише посилання.
Джош

27

Ви можете використовувати "Бібліотеку закриття" (Google), щоб зробити переширювальний кодер / декодер JSON.

Просто перейдіть на сторінку http://closure-compiler.appspot.com/

і вставте наступне в текстове поле, а потім натисніть "Скласти":

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// @use_closure_library true
// ==/ClosureCompiler==

goog.require('goog.json');
if (!window['JSON']) window['JSON']={};
if (typeof window['JSON']['stringify'] !== 'function') window['JSON']['stringify']=goog.json.serialize;
if (typeof window['JSON']['parse'] !== 'function') window['JSON']['parse']=goog.json.parse;

Я думаю, що його serializeслід змінити на stringifyповторне використання рідної функції браузера, якщо така є
Томас

1
перейменовано в JSON.serialize в JSON.stringify
stewe


3

jQuery не потребує цієї функціональності внутрішньо, і, отже, не надає зручного методу для цього.

JSON.stringify () - це стандартний і рекомендований спосіб кодування об’єкта в рядкове представлення JSON цього об’єкта. Це метод власного об’єкта JSON у багатьох браузерах, і рекомендується використовувати json2.js (https://github.com/douglascrockford/JSON-js) для забезпечення резервної копії.


2

Щоб спиратися на відповідь Стю, компілятор закриття з увімкненим Advanced дає вам скрипт, який забруднює глобальний простір імен купою змінних з однієї літери. Отже, я просто обертаю його анонімним викликом функції так:

(function() {
  function g(a) {
    var b = typeof a;
    if ("object" == b)
      if (a) {
        if (a instanceof Array) return "array";
        if (a instanceof Object) return b;
        var c = Object.prototype.toString.call(a);
        if ("[object Window]" == c) return "object";
        if ("[object Array]" == c || "number" == typeof a.length && "undefined" != typeof a.splice && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("splice")) return "array";
        if ("[object Function]" == c || "undefined" != typeof a.call && "undefined" != typeof a.propertyIsEnumerable && !a.propertyIsEnumerable("call")) return "function"
      } else return "null";
    else if ("function" == b && "undefined" == typeof a.call) return "object";
    return b
  };

  function h(a) {
    a = "" + a;
    if (/^\s*$/.test(a) ? 0 : /^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r\u2028\u2029\x00-\x08\x10-\x1f\x80-\x9f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, ""))) try {
      return eval("(" + a + ")")
    } catch (b) {}
    throw Error("Invalid JSON string: " + a);
  }

  function i(a, b) {
    var c = [];
    j(new k(b), a, c);
    return c.join("")
  }

  function k(a) {
    this.a = a
  }

  function j(a, b, c) {
    switch (typeof b) {
      case "string":
        l(b, c);
        break;
      case "number":
        c.push(isFinite(b) && !isNaN(b) ? b : "null");
        break;
      case "boolean":
        c.push(b);
        break;
      case "undefined":
        c.push("null");
        break;
      case "object":
        if (null == b) {
          c.push("null");
          break
        }
        if ("array" == g(b)) {
          var f = b.length;
          c.push("[");
          for (var d = "", e = 0; e < f; e++) c.push(d), d = b[e], j(a, a.a ? a.a.call(b, "" + e, d) : d, c), d = ",";
          c.push("]");
          break
        }
        c.push("{");
        f = "";
        for (e in b) Object.prototype.hasOwnProperty.call(b, e) && (d = b[e], "function" != typeof d && (c.push(f), l(e, c), c.push(":"),
          j(a, a.a ? a.a.call(b, e, d) : d, c), f = ","));
        c.push("}");
        break;
      case "function":
        break;
      default:
        throw Error("Unknown type: " + typeof b);
    }
  }
  var m = {
      '"': '\\"',
      "\\": "\\\\",
      "/": "\\/",
      "\u0008": "\\b",
      "\u000c": "\\f",
      "\n": "\\n",
      "\r": "\\r",
      "\t": "\\t",
      "\x0B": "\\u000b"
    },
    n = /\uffff/.test("\uffff") ? /[\\\"\x00-\x1f\x7f-\uffff]/g : /[\\\"\x00-\x1f\x7f-\xff]/g;

  function l(a, b) {
    b.push('"', a.replace(n, function(a) {
      if (a in m) return m[a];
      var b = a.charCodeAt(0),
        d = "\\u";
      16 > b ? d += "000" : 256 > b ? d += "00" : 4096 > b && (d += "0");
      return m[a] = d + b.toString(16)
    }), '"')
  };
  window.JSON || (window.JSON = {});
  "function" !== typeof window.JSON.stringify && (window.JSON.stringify = i);
  "function" !== typeof window.JSON.parse && (window.JSON.parse = h);
})();

Тепер ви можете зателефонувати:

var JSONString = JSON.stringify({name: 'value'});


1

Часто функція JSON.stringify () не потрібна під час використання jQuery. Візьмемо для прикладу поширений випадок використання ajax для надсилання даних javascript на сервер, jquery має вбудовані функції для обробки цього: (приклади з http://api.jquery.com/category/ajax/ )

$.post("test.php", { name: "John", time: "2pm" } );
$.post("test.php", { 'choices[]': ["Jon", "Susan"] });
$.getJSON("test.js", { name: "John", time: "2pm" }, function(json) {
    alert("JSON Data: " + json.users[3].name);
});

У всіх прикладах вище надіслані дані javascript автоматично серіалізуються jQuery.

У цих випадках серіалізація відрізняється від JSON.Stringify (), натомість дані серіалізуються у рядок запиту html (див .: http://en.wikipedia.org/wiki/Query_string#Structure ).

Однак ця форма серіалізації підходить для більшості (але не для всіх) додатків

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