Разбор JSON -> stringify -> Разбор разбит? - PullRequest
1 голос
/ 17 сентября 2009

Я использую json2.js для этого:

            var str = '{"elements":[{"text": "", "colour": "#66AA50", "type": "line"}]}';
            var obj = JSON.parse(str);
            var str2 = JSON.stringify(obj);
            var obj2 = JSON.parse(str2);

Странно то, что obj2 - неработающая версия obj, т. Е. Она не идентична ей.

В моем случае obj2 имеет только одно поле с именем elements , которое установлено в строку

"[{"text": "", "colour": "#66AA50", "type": "line"}]"

Проверено в FF 3.0.14

Следующий сценарий работает нормально, если реализован с помощью прототипа .toJSON () / .evalJSON ()

Что-то не так с моим кодом или библиотекой JSON?

Спасибо!

Ответы [ 3 ]

1 голос
/ 17 сентября 2009

У меня работает (FF3.5)

var str = '{"elements":[{"text": "", "colour": "#66AA50", "type": "line"}]}';
            var obj = JSON.parse(str);
            var str2 = JSON.stringify(obj);
            var obj2 = JSON.parse(str2);

Equals = function(a,b)
{
  //Check if the arrays are undefined/null
  if(!a || !b)
    return false;

  //first compare their lengths
  if(a.length == b.length)
  {
    //go thru all the vars
    for(var i = 0; i < a.length;i++)
    {
      //if the var is an array, we need to make a recursive check
      //otherwise we'll just compare the values
      if(typeof a[i] == 'object') {
        if(!Equals(a[i],b[i]))
          return false;
      }
      else if(a[i] != b[i])
        return false;
    }
    return true;
  }
  else return false;
}

alert (Equals (obj,obj2)); //true
alert (JSON.stringify(obj) == JSON.stringify(obj2)); //true
alert (obj == obj2); //false (different pointer)
0 голосов
/ 08 марта 2016

Существует известная проблема, когда вы используете prototype.js, поскольку он разрывает JSON.stringify () с проблемным toJSON (). Однако вы можете исправить это с помощью:

delete Array.prototype.toJSON

См: Причудливость массива JSON.stringify () с Prototype.js

0 голосов
/ 17 сентября 2009

Я тоже не вижу поведения, о котором вы упоминаете. Поскольку у меня есть Firefox 3.5.3, который имеет собственную версию объекта JSON, я взял последнюю версию json2.js (в исходном файле 2009-08-17) и изменил исходный код для создания объекта JSON2 вместо JSON объект. Библиотека построена так, чтобы не переопределять существующую реализацию JSON. Кроме того, я мог бы сравнить код библиотеки с собственным кодом Firefox.

Я прошел по следующему коду и не увидел элементы, перечисленные в виде строки. Можете ли вы добавить комментарий с датой внутри имеющейся у вас версии json2.js?

var str = '{"elements":[{"text": "", "colour": "#66AA50", "type": "line"}]}';
var obj = JSON.parse(str);
var str2 = JSON.stringify(obj);
var obj2 = JSON.parse(str2);

var obj3 = JSON2.parse(str);
var str3 = JSON2.stringify(obj3);
var obj4 = JSON2.parse(str3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...