Вопрос по javascript, json, object – Реверс JSON.stringify?

290

Я строю такой объект, как{'foo': 'bar'}

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

просто попробуйте JSON.parse. если ваш браузер не поддерживает, попробуйте json2.js Anirudha Gupta
Возможно, мне следовало добавить еще один (читай четвертый) ответ, в котором говорилось, что вы должны сделать JSON.parse Titouan de Bailleul
Обратите внимание, что{foo: 'bar'} не является допустимым JSON (в то время как это допустимое выражение javascript). leemes
ребята, мы здесь имеем дело с лолкатами. Pointy
@RobW, получается, что ваша ссылка Google указывает на этот вопрос как на первое место. #ironic Chase Florell

Ваш Ответ

8   ответов
5

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

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

1. JSON.parse()
2. JSON.stringify() 

The JSON.parse() method parses a JSON string - i.e. reconstructing the original JavaScript object

var jsObject = JSON.parse(jsonString);

JSON.stringify() method accepts a JavaScript object and returns its JSON equivalent.

var jsonString = JSON.stringify(jsObject);

5

Рекомендуется использоватьJSON.parse

Есть альтернатива, которую вы можете сделать:

 var myObject = eval('(' + myJSONtext + ')');

JSON в JavaScript

Почему использование JavaScript-функции eval - плохая идея?

это, возможно, немного более уязвимо для подделки кода
-2
$("#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();
        }
    });
});
2

Проверь это.
http://jsfiddle.net/LD55x/

Код:

var myobj = {};
myobj.name="javascriptisawesome";
myobj.age=25;
myobj.mobile=123456789;
debugger;
var str = JSON.stringify(myobj);
alert(str);
var obj = JSON.parse(str);
alert(obj);
57

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) ); }

You'll only get ownProperties of the object and lose prototypes:

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

You'll lose identity:

var o = {};
var oo = jsonrepack(o);
console.log( o === oo ); // false

Functions dont survive:

jsonrepack( { f:function(){} } ); // Returns {}

Date objects end up as strings:

jsonrepack(new Date(1990,2,1)); // Returns '1990-02-01T16:00:00.000Z'

Undefined values dont survive:

var v = { x:undefined }
console.log("x" in v);              // true
console.log("x" in jsonrepack(v));  // false

Objects that provide a toJSON function may not behave correctly.

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
Одним из примеров этого является то, что{ bar:"bar" } (из вашего прототипа)not considered valid json посколькуfoo переменная, а не строка. Действительный JSON нуждается вkey бытьstring.
Это чрезвычайно исчерпывающий ответ, и гораздо более достойный быть принятым ответом. Спасибо за вашу отличную работу.
Я прочитал OP как «я преобразовал объект javascript в строку JSON, и теперь я хочу преобразовать его обратно - как мне это сделать?» Все остальные ответы говорят просто использоватьJSON.parse, Я просто предупреждаю, что есть много случаев, которые не будут обрабатываться правильно. Если вы используете чистые примитивные данные (без классов, прототипов) и только типы данных, поддерживаемые JSON (без дат, XML, HTML и т. Д.), То все в порядке.
Также в JavascriptX = { foo:"bar" } такой же какX = { "foo":"bar" } который так же, какX = {}; X.foo = "bar" который так же, какX={}; X["foo"] = "bar" Полученный объект идентичен во всех 4 случаях. Это не имеет значения для достоверности сгенерированного JSON.
ПоJSON SPEC "JSON is a text format that is completely language independent but uses conventions that are familiar to programmers of the C-family of languages, including C, C++, C#, Java, JavaScript, Perl, Python, and many others.", Для меня это говорит о том, что JSON следует использовать только для не зависящих от языка типов / данных. Следовательно, ваш пример (хотя и очень верный) относится только к JSON в его ассоциации с JavaScript и должен быть более определен как JSONP, а не как истинный JSON ... IMO
5

Как насчет этого

var parsed = new Function('return ' + stringifiedJSON )();

Это более безопасная альтернатива дляeval.

var stringifiedJSON = '{"hello":"world"}';
var parsed = new Function('return ' + stringifiedJSON)();
alert(parsed.hello);

64

JSON.parse противоположностьJSON.stringify.

432

Вам нужно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);
}

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

Похожие вопросы