Причудливость массива JSON.stringify () с помощью Prototype.js - PullRequest
81 голосов
/ 02 апреля 2009

Я пытаюсь выяснить, что пошло не так с моей сериализацией JSON, у меня есть текущая версия моего приложения и старая, и я нахожу некоторые удивительные различия в том, как работает JSON.stringify () (Использование библиотеки JSON из json.org).

В старой версии моего приложения:

 JSON.stringify({"a":[1,2]})

дает мне это;

"{\"a\":[1,2]}"

в новой версии,

 JSON.stringify({"a":[1,2]})

дает мне это;

"{\"a\":\"[1, 2]\"}"

есть идеи, что могло бы измениться, чтобы одна и та же библиотека помещала кавычки в скобки массива в новой версии?

Ответы [ 11 ]

0 голосов
/ 21 апреля 2015

Если вы не хотите все убивать, и у вас есть код, который подходит для большинства браузеров, вы можете сделать это следующим образом:

(function (undefined) { // This is just to limit _json_stringify to this scope and to redefine undefined in case it was
  if (true ||typeof (Prototype) !== 'undefined') {
    // First, ensure we can access the prototype of an object.
    // See http://stackoverflow.com/questions/7662147/how-to-access-object-prototype-in-javascript
    if(typeof (Object.getPrototypeOf) === 'undefined') {
      if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {
        Object.getPrototypeOf = function getPrototypeOf (object) {
          return object.__proto__;
        };
      } else {
        Object.getPrototypeOf = function getPrototypeOf (object) {
          // May break if the constructor has been changed or removed
          return object.constructor ? object.constructor.prototype : undefined;
        }
      }
    }

    var _json_stringify = JSON.stringify; // We save the actual JSON.stringify
    JSON.stringify = function stringify (obj) {
      var obj_prototype = Object.getPrototypeOf(obj),
          old_json = obj_prototype.toJSON, // We save the toJSON of the object
          res = null;
      if (old_json) { // If toJSON exists on the object
        obj_prototype.toJSON = undefined;
      }
      res = _json_stringify.apply(this, arguments);
      if (old_json)
        obj_prototype.toJSON = old_json;
      return res;
    };
  }
}.call(this));

Это кажется сложным, но это сложно только для большинства случаев использования. Основная идея - переопределить JSON.stringify, чтобы удалить toJSON из объекта, переданного в качестве аргумента, затем вызвать старый JSON.stringify и, наконец, восстановить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...