web-dev-qa-db-ja.com

JSON.stringifyの逆?

私は{'foo': 'bar'}のようなオブジェクトをstringyfingしています

文字列をオブジェクトに戻す方法は?

297
thelolcat

あなたは 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);
}
446
Chase Florell

JSON.parseJSON.stringifyの逆です。

66

JSON.stringifyJSON.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.parseJSON.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
58

JSON.parseを使用することをお勧めします

あなたがすることができる代替手段があります:

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

Jsonのjavascript

なぜJavaScriptのeval関数を使うのは悪い考えですか?

5
Mina Gabriel

これはどう

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

これはevalのより安全な代替策です。

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

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

ネイティブJSONオブジェクトには2つの重要なメソッドがあります。

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

5
Shaik Rasool

これをチェックしてください。
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);
2
Manish Gupta