JSON.stringifyの逆?


338

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

文字列をオブジェクトに戻すにはどうすればよいですか?


6
これ{foo: 'bar'}は有効なJSON ではありません(有効なJavaScript式です)。
leemes

2
JSON.parseを試してください。お使いのブラウザがサポートしていない場合は、json2.jsを試してください
Anirudha Gupta '23

10
ここでlolcatを扱っている人たち。
とがった

1
多分私はあなたがJSON.parseをするべきだと言って別の(4番目に読む)答えを追加するべきでした...
Titouan de Bailleul

33
@RobW、あなたのグーグルリンクがトップヒットとしてこの質問に戻っていることがわかりました。#ironic
Chase Florell

回答:


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
プロのヒント:メソッドがNode / Jsをクラッシュさせる可能性があるため、常にJSON.parse()をtry-catch構造体に入れてください
Spock


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#、Javaのは、JavaScript、PerlやPython、および多くの他を含む言語のC-家族のプログラマに精通している完全に言語に依存しないが、用途の規則であるテキスト形式です。」。私にとってこれは、JSONは言語にとらわれないタイプ/データにのみ使用されるべきであると言います。したがって、例は(非常に有効ですが)JavaScriptに関連付けられているJSONにのみ関連しており、真のJSONではなくJSONPとして定義する必要があります... IMOJSON SPEC
Chase Florell 2013年

この一例は、ことある{ bar:"bar" }さ(プロトタイプ)から有効なJSONとは見なされないので、foo変数ではなく文字列です。有効なjsonはである必要keyがありstringます。
チェイスフローレル2013年

3
OPを読み、「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オブジェクトには、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

これはどう

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

これはのより安全な代替手段ですeval


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

-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();
        }
    });
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.