JSON文字列をオブジェクトに安全に変換する


1336

JSONデータの文字列がある場合、その文字列をJavaScriptオブジェクトに安全に変換するにはどうすればよいですか?

明らかに、私はこれを次のようなもので安全に行うことができます:

var obj = eval("(" + json + ')');

しかし、他のコードを含むJSON文字列に対して脆弱であり、単純に評価するのは非常に危険なようです。


77
ほとんどの言語では、evalには追加のリスクがあります。Evalは、ハッカーによって悪用される可能性のある扉を残します。ただし、すべてのJavaScriptはクライアントで実行されることに注意してください。 EXPECTそれがハッカーによって変更されること。コンソールを使用するだけで、好きなものを評価できます。サーバー側で保護を構築する必要があります。
ビーチハウス2013

19
OK、2014年になりましたeval。コードを「コードインジェクション」に公開するため、JSON文字列を解析するために使用することはできません。JSON.parse(yourString)代わりに使用してください。
ダニエル

JSONデータはリテラルですか?
shanechiu 2017

@shanechiu:スカラーデータ型の場合、そうです。Key-Value構文を含む単なる文字列です。
0zkr PM '17 / 09/17

回答:


1963

JSON.parse(jsonString) 合理的に最新のブラウザを保証できる限り、JavaScriptは純粋なJavaScriptアプローチです。


74
Node.jsにとって安全だと確信しています
Stephen

76
@vsyncあなたは、これがあることを実現するかONLYあなたはjavascriptのタグの説明を読めばあなたがこれを...」が表示されます...ピュアJavascriptの回答を純粋なJavaScriptの答えは、フレームワーク/ライブラリのタグも含まれていない限り。期待される」..私はこれを与える+1を ...だけjavascriptの答えであるために
iConnor


12
NodeJSを実行している場合、jsonStringをJSONオブジェクトに解析するためだけにjQueryをロードする方法はありません。ジョナサンの回答を賛成する
アントニー

6
よると、このリンクそれは言うものの、それは、IE8 +によってサポートされています:Requires document to be in IE8+ standards mode to work in IE8.
JoshuaDavid

878

jQueryメソッドは非推奨になりました。代わりにこのメソッドを使用してください:

let jsonObject = JSON.parse(jsonString);

非推奨のjQuery機能を使用した元の回答

jQueryを使用している場合は、次を使用します。

jQuery.parseJSON( jsonString );

それはまさにあなたが探しているものです(jQuery ドキュメントを参照してください)。


7
JSON.parse()でこれを使用する理由はありますか?
Jon

8
jQuery.parseJSONJSON.parse存在する場合はデフォルトで使用されるため、実際のものよりもこれを使用する唯一の理由は、<IE7のフォールバックが必要な場合です。jQuery 1.6で変更されました:james.padolsey.com/jquery/#v=1.6.0&fn=jQuery.parseJSON
Karl-

9
2016年の更新:jQuery 3.0以降、$。parseJSONは非推奨になり、代わりにネイティブJSON.parseメソッドを使用する必要があります。
jkdev 2016年

159

この回答はIE <7向けです。最新のブラウザでは、上記のJonathanの回答を確認してください。

この回答は古くなっており、上記のJSON.parse(jsonString))のジョナサンの回答が今のところ最良の回答です。

JSON.orgには、JavaScript用の4つの異なるものを含む、多くの言語用のJSONパーサーがあります。私はほとんどの人がjson2.jsをgoto実装と見なすと思います。


24
この答えの反対投票をやめてほしい。2008年に投稿されたときは正確でした。新しいものに賛成票を入れてください。
John

22
回答が古くなっている場合は、更新することを検討してください。
Sotirios Delimanolis 2015年

2
IE <8の場合、これを使用する必要があります。
Mahmoodvcs 2015

74

JSON.parse()」の簡単なコード例を使用してください:

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

そしてそれを逆にします:

var str = JSON.stringify(arr);

23

他の方法はわかりませんが、Prototype(JSONチュートリアル)で行う方法を次に示します。

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

evalJSON()引数としてtrueを使用して呼び出すと、着信文字列がサニタイズされます。


22

これは問題のようです:

Ajax websocketなどを介して受信された入力はString形式になりますが、それがであるかどうかを知る必要がありますJSON.parsable。問題は、常に実行する場合JSON.parse、プログラムは「正常に」続行される可能性がありますが、恐ろしいでコンソールにエラーがスローされたままになること"Error: unexpected token 'x'"です。

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

番号。問題は、JSONオブジェクトを予期しており(function(){ postCookiesToHostileServer(); }());、Nodeのコンテキストで最終的に、またはさらに厄介なものになる可能性があることです。
Yaur 14

JSON.parseは関数の入力をスクラブします(この場合、IIF->オブジェクトとしては役に立ちません)。この問題に取り組む最善の方法は、try / catchです。(編集を参照)
コーディ

18

jQueryを使用している場合は、以下も使用できます。

$.getJSON(url, function(data) { });

その後、次のようなことができます

data.key1.something
data.key1.something_else


あなたはjQueryを使用していますね?
Alexandre C.

15
$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

コールバックには、返されたデータが渡されます。これは、JSON構造で定義され、$.parseJSON()メソッドを使用して解析されたJavaScriptオブジェクトまたは配列になります。


12

楽しみのために、関数を使用する方法を次に示します。

 jsonObject = (new Function('return ' + jsonFormatData))()

1
興味深いアプローチですが、JSON.Parseを使用してこれを使用するかどうかはわかりませんが、誰かがボックスの外側で考えているのを見るのは素晴らしいことです。

5
これは、を使用evalする場合と非常によく似ており、安全ではありません。:P
Florrie、2015年

7
これには、使用することのすべての欠点evalがありますが、より複雑で、メンテナーが理解するのが難しくなります。
クエンティン

9

使用するのJSON.parseがおそらく最善の方法です。

こちらがライブデモの例です。

var jsonRes = '{ "students" : [' +
          '{ "firstName":"Michel" , "lastName":"John" ,"age":18},' +
          '{ "firstName":"Richard" , "lastName":"Joe","age":20 },' +
          '{ "firstName":"James" , "lastName":"Henry","age":15 } ]}';
var studentObject = JSON.parse(jsonRes);

9

parse()メソッドを使用する最も簡単な方法:

var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);

次に、JSON要素の値を取得できます。次に例を示します。

var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;

ドキュメントで説明されているjQueryの使用jQuery.parseJSON()

JSON.parse(jsonString);

9

このDataオブジェクトでメソッドを使用してみてください。例:Data='{result:true,count:1}'

try {
  eval('var obj=' + Data);
  console.log(obj.count);
}
catch(e) {
  console.log(e.message);
}

この方法は、シリアルポートプログラミングで作業しているときにNodejsで本当に役立ちます


人々がどのように「eval is evil」に
こだわっているの

コンセンサスは、このトリックが文字列をJSONオブジェクトに変換する安全な方法ですか?追加のjsインポートが必要ないので、これを使用できます。
Whome 2014年

1
ANY使ったアプローチevalまたはFunction同等に脆弱である
Slai

undefined; function bye() {...} bye();
Salvioner

5

「より良い」方法を見つけました:

CoffeeScriptの場合:

try data = JSON.parse(jqxhr.responseText)
data ||= { message: 'Server error, please retry' }

Javascriptの場合:

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

4

JSONの解析は常に面倒です。入力が期待どおりでない場合、エラーがスローされ、実行中の処理がクラッシュします。

次の小さな関数を使用して、入力を安全に解析できます。入力が無効であったり、すでにオブジェクトである場合でも、常にオブジェクトを回転させます。これは、ほとんどの場合に適しています。

JSON.safeParse = function (input, def) {
  // Convert null to empty object
  if (!input) {
    return def || {};
  } else if (Object.prototype.toString.call(input) === '[object Object]') {
    return input;
  }
  try {
    return JSON.parse(input);
  } catch (e) {
    return def || {};
  }
};

Object.prototype.toString.call(input) === '[object Object]'typeof input === 'object'IMOである必要があります
セルジュK.

typeof入力は、nullおよび配列のオブジェクトも返します。したがって、これを行う安全な方法ではありません。
Tahsin Turkoz、2018年

あなたはnull以前にすでにケースをカバーしていて、配列オブジェクトです。テストしたい場合は、を使用できますinstanceof。さらに、この関数にを指定するとArray、それがキャッチされreturn def、完全に細かい配列が返された可能性があります。
Serge K.

私のコメントは、オブジェクトをキャッチする際の常識についてでした。私の機能にはいくつかの防止策がありますが、typeof入力を使用することは、一般的にオブジェクトを検出する好ましい方法ではありません。
Tahsin Turkoz、2018年

IMO、常識ではtoString()、変数がオブジェクトであるかどうかを確認するメソッドは使用されません。AngularJSjQueryUnderscore、さらにはdevs
Serge K.


3

次のような文字列がある場合:

"{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"

その後、JSON.parse2回使用するだけでこの文字列をJSONオブジェクトに変換できます。

var sampleString = "{\"status\":1,\"token\":\"65b4352b2dfc4957a09add0ce5714059\"}"
var jsonString= JSON.parse(sampleString)
var jsonObject= JSON.parse(jsonString)

そして、JSONオブジェクトから値を抽出することができます:

// instead of last JSON.parse:
var { status, token } = JSON.parse(jsonString);

結果は次のようになります。

status = 1 and token = 65b4352b2dfc4957a09add0ce5714059

3

JSON.parse() 関数に渡されたJSON文字列をJSONオブジェクトに変換します。

よく理解するには、を押しF12てブラウザで「要素の検査」を開き、コンソールに移動して次のコマンドを記述します。

var response = '{"result":true,"count":1}'; //sample json object(string form)
JSON.parse(response); //converts passed string to JSON Object.

次のコマンドを実行します。

console.log(JSON.parse(response));

出力はObjectとして取得されます{result: true, count: 1}

そのオブジェクトを使用するために、おそらくそれを変数に割り当てることができますobj

var obj = JSON.parse(response);

使用することによりobj、ドット(.)演算子を使用すると、JSONオブジェクトのプロパティにアクセスすることができます。

コマンドを実行してみてください:

console.log(obj.result);

3

公式ドキュメント

このJSON.parse()メソッドはJSON文字列を解析し、文字列で記述されたJavaScript値またはオブジェクトを構築します。reviver結果のオブジェクトが返される前に変換を実行するオプションの関数を提供できます。

構文:

JSON.parse(text[, reviver])

パラメーター:

text :JSONとして解析する文字列。JSON構文の説明については、JSONオブジェクトを参照してください。

reviver (optional) :関数の場合、これは、解析によって最初に生成された値が、返される前にどのように変換されるかを規定します。

戻り値

指定されたJSONテキストに対応するオブジェクト。

例外

解析する文字列が有効なJSONでない場合、SyntaxError例外をスローします。



2

JSON文字列をJSON.parse()で解析すると、データはJavaScriptオブジェクトになります。

JSON.parse(jsonString)

ここで、JSONはJSONデータセットを処理することを表します。

Webサーバーからこのテキストを受け取ったとします。

'{ "name":"John", "age":30, "city":"New York"}'

JSONオブジェクトに解析するには:

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}'); 

以下objは、それぞれのJSONオブジェクトです。

{ "name":"John", "age":30, "city":"New York"}

値をフェッチするには、.演算子を使用します。

obj.name // John
obj.age //30

JavaScriptオブジェクトをで文字列に変換しますJSON.stringify()


1

さまざまな入力タイプの解析をカバーするだけです

JSON.parse()でデータを解析すると、データはJavaScriptオブジェクトになります。

var obj = JSON.parse('{ "name":"John", "age":30, "city":"New York"}');

配列から派生したJSONでJSON.parse()を使用すると、メソッドはJavaScriptオブジェクトではなくJavaScript配列を返します。

var myArr = JSON.parse(this.responseText);
console.log(myArr[0]);

JSONでは日付オブジェクトは許可されていません。日付については、このような何かをします

var text = '{ "name":"John", "birth":"1986-12-14", "city":"New York"}';
var obj = JSON.parse(text);
obj.birth = new Date(obj.birth);

JSONでは関数を使用できません。関数を含める必要がある場合は、文字列として記述します。

var text = '{ "name":"John", "age":"function () {return 30;}", "city":"New York"}';
var obj = JSON.parse(text);
obj.age = eval("(" + obj.age + ")");

0

古い質問new Function()ですが、データを返す匿名関数であるを使用してこの解決策に気づいた人はいません。


ほんの一例:

 var oData = 'test1:"This is my object",test2:"This is my object"';

 if( typeof oData !== 'object' )
  try {
   oData = (new Function('return {'+oData+'};'))();
  }
  catch(e) { oData=false; }

 if( typeof oData !== 'object' )
  { alert( 'Error in code' ); }
 else {
        alert( oData.test1 );
        alert( oData.test2 );
      }

これは関数内で実行され、コードで直接コンパイルされないため、少し安全です。したがって、その中に関数宣言がある場合、それはデフォルトのウィンドウオブジェクトにバインドされません。

これを使用して、DOM要素の構成設定(たとえば、データ属性)をシンプルかつ高速に「コンパイル」します。


0

概要:

Javascript(ブラウザとNodeJSの両方)には組み込みJSONオブジェクトがあります。このオブジェクトには、を処理するための2つの便利なメソッドがありJSONます。それらは次のとおりです。

  1. JSON.parse()JSON引数として 取り、JSオブジェクトを返します
  2. JSON.stringify() 引数としてJSオブジェクトを受け取り、オブジェクトを返しJSONます

その他のアプリケーション:

それに非常に便利に対処するために、JSONそれらは他の手段に使用できます。両方のJSON方法の組み合わせにより、配列またはオブジェクトのディープクローンを非常に簡単に作成できます。例えば:

let arr1 = [1, 2, [3 ,4]];
let newArr = arr1.slice();

arr1[2][0] = 'changed'; 
console.log(newArr); // not a deep clone

let arr2 = [1, 2, [3 ,4]];
let newArrDeepclone = JSON.parse(JSON.stringify(arr2));

arr2[2][0] = 'changed'; 
console.log(newArrDeepclone); // A deep clone, values unchanged


0

reviver関数を使用してフィルタリングすることもできます。

var data = JSON.parse(jsonString, function reviver(key, value) {
   //your code here to filter
});

詳細については、こちらをご覧くださいJSON.parse


0

JSON.parseは、文字列をオブジェクトに変換する正しい方法ですが、解析された文字列がオブジェクトでない場合、または文字列が正しくない場合、エラーがスローされ、残りのコードが壊れるため、 JSON.parse関数をtry-catchのようにラップするのが理想的です

try{
   let obj = JSON.parse(string);
}catch(err){
   console.log(err);
}

-1

これを試してください。これはtypescriptで書かれています。

         export function safeJsonParse(str: string) {
               try {
                 return JSON.parse(str);
                   } catch (e) {
                 return str;
                 }
           }

Typescriptは初めてです。これにはどのようなメリットがありJSON.parse()ますか?
Marc L.

例外が発生した場合、これは入力文字列自体を返します
Supun Dharmarathne '31 / 10/31

-1
/**
 * Safely turning a JSON string into an object
 *
 * @param {String} str - JSON String
 * @returns deserialized object, false if error
 */
export function jsonParse(str) {
  let data = null;
  try {
    data = JSON.parse(str);
  } catch (err) {
    return false;
  }
  return data;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.