29

以下の文字列をJavaScriptで配列に変換したい。

{a:12, b:c, foo:bar}

この文字列をオブジェクトの配列に変換するにはどうすればよいですか? クールなアイデアはありますか?

4

6 に答える 6

81

Douglas Crockford(JavaScriptの最大の達人の1人)がここで示唆しているように、これを行う最良の方法は、eval()よりも高速であるだけでなく、より安全であるJSONネイティブパーサーを使用することだと思います。

ネイティブJSONパーサーはすでに次の場所で利用できます。

  • Firefox3.5以降
  • IE 8+
  • Opera 10.5+
  • Safari Safari 4.0.3+
  • Chrome(どのバージョンかわからない)

また、Crockfordは、json2.jsと呼ばれるjavascriptで安全なフォールバックを行いました。これは、eval()アプローチを適応させたもので、いくつかのセキュリティビットが追加され、ネイティブのJSONパーサーAPIが使用されています。そのファイルをインクルードし、最初の行を削除して、ネイティブJSONパーサーを使用するだけで、ファイルが存在しない場合はjson2が機能します。

次に例を示します。

var myJSONString = '{ "a": 1, "b": 2 }',
    myObject = JSON.parse(myJSONString);

解析すると、属性ab、を持つオブジェクトが取得されます。ご存知かもしれませんが、オブジェクトをJavaScriptのハッシュテーブルまたは連想配列として扱うことができるため、次のような値にアクセスできます。

myObject['a'];

連想配列ではなく単純な配列が必要な場合は、次のようにすることができます。

var myArray = [];
for(var i in myObject) {
    myArray.push(myObject[i]);
}

最後に、プレーンJavaScriptでは必要ありませんが、JSON仕様では、メンバーのキーを二重引用符で囲む必要があります。したがって、naviteパーサーはそれなしでは機能しません。私があなたならそれを追加しますが、それが不可能な場合はvar myObject = eval( "(" + myString + ")" );アプローチを使用してください。

于 2010-08-27T09:40:58.833 に答える
10

文字列は不正な形式のJSONであるため、JSONパーサーは文字列を適切に解析できず、eval()でさえエラーをスローします。また、配列ではなく、HashMapまたは単にオブジェクトリテラル(不正な形式)です。オブジェクトリテラルに数値と文字列の値のみが含まれる(子オブジェクト/配列は含まれない)場合は、次のコードを使用できます。

function malformedJSON2Array (tar) {
    var arr = [];
    tar = tar.replace(/^\{|\}$/g,'').split(',');
    for(var i=0,cur,pair;cur=tar[i];i++){
        arr[i] = {};
        pair = cur.split(':');
        arr[i][pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1];
    }
    return arr;
}

malformedJSON2Array("{a:12, b:c, foo:bar}");
// result -> [{a:12},{b:'c'},{foo:'bar'}]

そのコードは、文字列をオブジェクトの配列(複数形)に変換します。

ただし、実際には配列ではなくHashMap(連想配列)が必要な場合は、次のコードを使用してください。

function malformedJSON2Object(tar) {
    var obj = {};
    tar = tar.replace(/^\{|\}$/g,'').split(',');
    for(var i=0,cur,pair;cur=tar[i];i++){
        pair = cur.split(':');
        obj[pair[0]] = /^\d*$/.test(pair[1]) ? +pair[1] : pair[1];
    }
    return obj;
}

malformedJSON2Object("{a:12, b:c, foo:bar}");
// result -> {a:12,b:'c',foo:'bar'}

上記のコードは、オブジェクトと配列のネストを開始すると、はるかに複雑になります。基本的に、不正な形式のJSONをサポートするには、 JSON.jsJSON2.jsを書き直す必要があります。

次のオプションも検討してください。これはまだ悪いことですが、HTMLタグの属性内にJSONを貼り付けるよりもわずかに優れています。

<div id="DATA001">bla</div>
<!-- namespacing your data is even better! -->
<script>var DATA001 = {a:12,b:"c",foo:"bar"};</script>

HTMLタグの属性内に引用符を入れており、引用符をエスケープしたくないため、文字列内の引用符を省略していると想定しています。

于 2010-09-01T07:36:48.627 に答える
8

最も簡単ですが、安全ではない方法は次のとおりです。

eval('(' + myJSONtext + ')')

ただし、これはJavaScriptコードを解釈するため、セキュリティホールがあります。これを防ぐには、jsonパーサーを使用します。フレームワーク(jquery、mootoolsなど)を使用している場合は、フレームワーク固有の呼び出しがあります。それらのほとんどは、 http: //www.json.org/js.htmlで入手可能なDouglasCrawfordのパーサーに基づいています。

于 2010-08-13T03:30:14.867 に答える
2

「for in」を使用できます

var myObject = {a:'12', b:'c', foo:'bar'};
var myArray = [];

for(key in myObject) {
    var value = myObject[key];
    myArray[key] = value;
}

myArray['a']; // returns 12

注: myObject には 1 つのレベルのキーと値のペアしかないことを考慮してください。

于 2010-08-13T03:36:49.593 に答える
1

jQuery を使用している場合は、$.parseJSON()関数があります。文字列の形式が正しくない場合は例外をスローし、「さらに何も渡さない場合、空の文字列、null、または未定義の「null」が parseJSON から返されます。ブラウザが JSON.parse、jQuery のネイティブ実装を提供する場合それを使用して文字列を解析します」

于 2010-08-31T20:34:35.940 に答える