Реверс JSON.stringify?


341

Я строчу объект как {'foo': 'bar'}

Как я могу превратить строку обратно в объект?


6
Обратите внимание, что {foo: 'bar'}это недопустимый JSON (хотя это допустимое выражение javascript).
Leemes

2
просто попробуйте JSON.parse. если ваш браузер не поддерживает, попробуйте json2.js
Гупта

10
ребята, мы имеем дело с лолкатом здесь.
Заостренный

1
Может быть, мне следовало добавить еще один (читай четвертый) ответ, в котором говорилось, что ты должен делать JSON.parse ...
Титуан де Байеул

33
@RobW, получается, что ваша ссылка на Google указывает на этот вопрос как на первое место. #ironic
Чейз Флорелл

Ответы:


502

Вам нужно JSON.parse()на строку.

var str = '{"hello":"world"}';
try {
  var obj = JSON.parse(str); // this is how you parse a string into JSON 
  document.body.innerHTML += obj.hello;
} catch (ex) {
  console.error(ex);
}


8
Совет для профессионалов: всегда помещайте JSON.parse () в структуры try-catch, так как метод может привести к сбою вашего Node / Js
Спок


63

JSON.stringifyи JSON.parseпочти опозиты, и "обычно" это будет работать:

var obj = ...;
var json = JSON.stringify(obj);  
var obj2 = JSON.parse(json);

так что obj и obj2 "одинаковы".

Однако есть некоторые ограничения, о которых следует знать. Часто эти проблемы не имеют значения, поскольку вы имеете дело с простыми объектами. Но я проиллюстрирую некоторые из них здесь, используя эту вспомогательную функцию:

function jsonrepack( obj ) { return JSON.parse(JSON.stringify(obj) ); }
  • Вы получите только ownPropertiesобъект и потеряете прототипы:

    var MyClass = function() { this.foo="foo"; } 
    MyClass.prototype = { bar:"bar" }
    
    var o = new MyClass();
    var oo = jsonrepack(o);
    console.log(oo.bar); // undefined
    console.log( oo instanceof MyClass ); // false
  • Вы потеряете личность:

    var o = {};
    var oo = jsonrepack(o);
    console.log( o === oo ); // false
  • Функции не выживают:

    jsonrepack( { f:function(){} } ); // Returns {}
  • Объекты Date заканчиваются как строки:

    jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'
  • Неопределенные значения не выживают:

    var v = { x:undefined }
    console.log("x" in v);              // true
    console.log("x" in jsonrepack(v));  // false
  • Объекты, предоставляющие toJSONфункцию, могут вести себя неправильно.

    x = { f:"foo", toJSON:function(){ return "EGAD"; } }
    jsonrepack(x) // Returns 'EGAD'

Я уверен, что есть проблемы с другими встроенными типами тоже. (Все это было протестировано с использованием node.js, поэтому вы можете получить немного другое поведение в зависимости от вашей среды).

Когда это имеет значение, иногда это можно преодолеть, используя дополнительные параметры JSON.parseи JSON.stringify. Например:

function MyClass (v) {
   this.date = new Date(v.year,1,1);
   this.name = "an object";
};

MyClass.prototype.dance = function() {console.log("I'm dancing"); }

var o = new MyClass({year:2010});
var s = JSON.stringify(o);

// Smart unpack function
var o2 = JSON.parse( s, function(k,v){
  if(k==="") { 
     var rv = new MyClass(1990,0,0);
     rv.date = v.date;
     rv.name = v.name;
     return rv
  } else if(k==="date") {
    return new Date( Date.parse(v) );
  } else { return v; } } );

console.log(o);             // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o.constructor); // [Function: MyClass]
o.dance();                  // I'm dancing

console.log(o2);            // { date: <Mon Feb 01 2010 ...>, name: 'an object' }
console.log(o2.constructor) // [Function: MyClass]        
o2.dance();                 // I'm dancing

1
Согласно «JSON - это текстовый формат, который полностью независим от языка, но использует соглашения, знакомые программистам языков семейства C, включая C, C ++, C #, Java, JavaScript, Perl, Python и многие другие». , Для меня это говорит о том, что JSON следует использовать только для не зависящих от языка типов / данных. Следовательно, ваш пример (хотя и очень верный) относится только к JSON в его ассоциации с JavaScript и должен быть более-менее определен как JSONP, а не как истинный JSON ... IMOJSON SPEC
Chase Florell

Одним из примеров этого является то, что { bar:"bar" }(из вашего прототипа) не считается допустимым JSON, поскольку fooэто переменная, а не строка. Действительный JSON должен keyбыть string.
Чейз Флорелл

3
Я прочитал ОП как «Я преобразовал объект javascript в строку JSON, и теперь я хочу преобразовать его обратно - как мне это сделать?» Все остальные ответы говорят просто использовать JSON.parse. Я просто предупреждаю, что есть много случаев, которые не будут обрабатываться правильно. Если вы используете чистые примитивные данные (без классов, прототипов) и только типы данных, поддерживаемые JSON (без дат, XML, HTML и т. Д.), То все в порядке.
Майкл Андерсон

Также в Javascript X = { foo:"bar" }есть то же, X = { "foo":"bar" }что и то же, X = {}; X.foo = "bar"что и то же, что и X={}; X["foo"] = "bar"получившийся объект идентичен во всех 4 случаях. Это не имеет значения для достоверности сгенерированного JSON.
Майкл Андерсон

2
Это чрезвычайно исчерпывающий ответ, и гораздо более достойный быть принятым ответом. Спасибо за вашу отличную работу.
подводное

6

http://jsbin.com/tidob/1/edit?js,console,output

Нативный объект JSON включает два ключевых метода.

1. JSON.parse()
2. JSON.stringify() 
  1. JSON.parse()Метод анализирует строку JSON - т.е. восстановления исходного объекта JavaScript

    var jsObject = JSON.parse(jsonString);

  2. Метод JSON.stringify () принимает объект JavaScript и возвращает его эквивалент JSON.

    var jsonString = JSON.stringify(jsObject);





-3
$("#save").click(function () {
    debugger
    var xx = [];
    var dd = { "firstname": "", "lastname": "", "address": "" };
    var otable1 = $("#table1").dataTable().fnGetData();

    for (var i = 0; i < otable1.length; i++) {
        dd.firstname = otable1[i][0];
        dd.lastname = otable1[i][1];
        dd.address = otable1[i][2];
        xx.push(dd);
        var dd = { "firstname": "", "lastname": "", "address": "" };
    }
    JSON.stringify(alert(xx));
    $.ajax({

        url: '../Home/save',
        type: 'POST',
        data: JSON.stringify({ u: xx }),
        contentType: 'application/json;',
        dataType: 'json',
        success: function (event) {
            alert(event);
            $("#table2").dataTable().fnDraw();
            location.reload();
        }
    });
});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.