Реверс JSON.stringify?


338

Я стримую такий предмет {'foo': 'bar'}

Як я можу повернути рядок до об'єкта?


6
Зауважте, що {foo: 'bar'}недійсний JSON (хоча це дійсний вираз JavaScript).
leemes

2
просто спробуйте JSON.parse. якщо у вашого браузера немає підтримки, спробуйте json2.js
Anirudha Gupta

10
хлопці, ми маємо справу з льоскотом тут.
Pointy

1
Можливо, я повинен був би додати ще одну (читати четверту) відповідь, вказуючи, що ви повинні зробити JSON.parse ...
Titouan de Bailleul

33
@RobW, виявляється, що ваше посилання google вказує на це питання як на головне звернення. #ironic
Чейз Фререлл

Відповіді:


501

Тобі потрібно 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 () у спробні структури, оскільки метод може зірвати ваш Node / Js
Спок


62

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 {}
  • Об'єкти дати закінчуються як рядки:

    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
Чейз Флорелл

Одним із прикладів цього є те, що { bar:"bar" }(з вашого прототипу) не вважається дійсним json, оскільки fooє змінною, а не рядком. Дійсною json потрібно keyбути a 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
Це надзвичайно вичерпна відповідь і набагато гідніша відповідь. Дякую за відмінну роботу.
scubbo

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.