質問
JSON データの文字列が与えられた場合、その文字列を安全に JavaScript オブジェクトに変換するにはどうすればよいでしょうか?
明らかに、次のようなものを使用すると、これを安全に行うことができません...
var obj = eval("(" + json + ')');
...しかし、そのため他のコードを含む json 文字列に対して脆弱なままになり、単純に eval するのは非常に危険であると思われます。
解決
JSON.parse(jsonString)
かなり最新のブラウザを保証できる限り、純粋な JavaScript アプローチです。
他のヒント
jQuery メソッドは非推奨になりました。代わりにこの方法を使用してください。
let jsonObject = JSON.parse(jsonString);
非推奨の jQuery 機能を使用した元の回答:
jQuery を使用している場合は、次のようにしてください。
jQuery.parseJSON( jsonString );
それはまさにあなたが探しているものです (jQuery を参照) ドキュメンテーション).
編集:この回答は IE < 7 用です。最新のブラウザの場合は、上記の Jonathan の回答を確認してください。
編集:この答えは時代遅れであり、 上記のジョナサンの答え (JSON.parse(jsonString)
) は現在、 ベストアンサー.
JSON.org には、JavaScript 用の 4 つの異なる言語を含む、多くの言語用の JSON パーサーがあります。ほとんどの人が検討すると思います json2.js 彼らのgoto実装。
次のような単純なコードを使用します。 MSDN のリンク.
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);
そして逆に
var str = JSON.stringify(arr);
他の方法はわかりませんが、次の方法でそれを行うことができます プロトタイプ (JSON チュートリアル).
new Ajax.Request('/some_url', {
method:'get',
requestHeaders: {Accept: 'application/json'},
onSuccess: function(transport){
var json = transport.responseText.evalJSON(true);
}
});
電話をかける evalJSON() 引数として true を指定すると、受信文字列がサニタイズされます。
これが問題のようです:
入力は、ajax Websocket などを介して受信され、常に String 形式になりますが、それが JSON.parsable であるかどうかを知る必要があります。問題は、常に JSON.parse を介して実行する場合、プログラムは「正常に」続行できますが、依然としてコンソールに恐ろしい「エラー:」というエラーが表示されることです。予期しないトークン「x」です。」
var data;
try {
data = JSON.parse(jqxhr.responseText);
} catch (_error) {}
data || (data = {
message: 'Server error, please retry'
});
使用している場合 jQuery, 、単に行うこともできます $.getJSON(url, function(data) { });
次に、次のようなことができます data.key1.something
, data.key1.something_else
, 、など。
$.ajax({
url: url,
dataType: 'json',
data: data,
success: callback
});
コールバックには返されたデータが渡されます。これは、JSON 構造で定義され、次のメソッドを使用して解析される JavaScript オブジェクトまたは配列になります。 $.parseJSON()
方法。
楽しみのために、 function を使用する方法を次に示します。
jsonObject = (new Function('return ' + jsonFormatData))()
この Data オブジェクトでメソッドを使用してみてください。元:Data='{result:true,count:1}
'
try {
eval('var obj=' + Data);
console.log(obj.count);
}
catch(e) {
console.log(e.message);
}
この方法は、Nodejs でシリアル ポート プログラミングを行うときに非常に役立ちます。
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);
最も簡単な使用方法 parse()
方法:
var response = '{"result":true,"count":1}';
var JsonObject= JSON.parse(response);
次に、の値を取得できます Json
要素、たとえば:
var myResponseResult = JsonObject.result;
var myResponseCount = JsonObject.count;
使用する jQuery で説明されているように、 ドキュメンテーション:
JSON.parse(jsonString);
「より良い」方法を見つけました。
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'
});
JSON.parse(jsonString);
json.parse がオブジェクトに変わります。
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 || {};
}
};
オブジェクトを JSON に変換して解析すると、次のように機能します。
JSON.parse(JSON.stringify(object))
次のような文字列があるとします。"{" status ":1、" token ":" 65b4352b2dfc4957a09add0ce5714059 "}"
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
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、カウント:1}。
そのオブジェクトを使用するには、それを変数、たとえば obj に割り当てることができます:-
var obj = JSON.parse(response);
obj と dot(.) 演算子を使用して、JSON オブジェクトのプロパティにアクセスできるようになりました。
コマンドを実行してみる
console.log(obj.result);
公式に文書化された:
の JSON.parse()
メソッドは JSON 文字列を解析し、文字列で記述された JavaScript 値またはオブジェクトを構築します。オプションの reviver
結果のオブジェクトが返される前に、そのオブジェクトに対して変換を実行する関数を提供できます。
構文
JSON.parse(text[, reviver])
パラメーター
文章
JSONとして解析する文字列。JSON 構文の説明については、JSON オブジェクトを参照してください。
リバイバー(オプション)
関数の場合、解析によって最初に生成された値が返される前にどのように変換されるかを規定します。
戻り値
指定された JSON テキストに対応するオブジェクト。
例外
解析する文字列が有効な JSON でない場合は、SyntaxError 例外をスローします。
も使用できます reviver
フィルタリングする機能。
var data = JSON.parse(jsonString, function reviver(key, value) {
//your code here to filter
});
詳細については、お読みください JSON.parse
古い質問、私は知っていますが、次を使用することによるこの解決策に誰も気づきません 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 要素 (データ属性など) の構成設定を簡単かつ迅速に「コンパイル」します。
JSON.parse() で json 文字列を解析すると、データは 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
逆に転送するには、JSON.stringify()でJavaScriptオブジェクトを文字列に変換します。
まとめ:
Javascript (ブラウザと NodeJS の両方) には、 JSON
物体。このオブジェクトには、処理するための 2 つの便利なメソッドがあります。 JSON
. 。それらは次のとおりです。
JSON.parse()
かかるJSON
引数として、JS オブジェクトを返します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
これを試してみてください。これは typescript で書かれています。
export function safeJsonParse(str: string) {
try {
return JSON.parse(str);
} catch (e) {
return str;
}
}