15

文字列 (アップロードされた入力!) を受け入れる NodeJS アプリがあります。入力を制御できません。データを処理するための REST サービスを構築しているだけです。

その文字列は、ループして各要素を抽出できるJSONオブジェクトの配列であることを意図しています...

私は(文字列として)以下を受け取っています:

[
  {Name: 'Jane',
       Id: '005b0000000MGa7AAG'},
  {Name: 'Tom',
       Id: '005b0000000MGa7AAF'}
]

これをJSON.parseしようとすると、

SyntaxError: Unexpected token N

これは無効な JSONであることを知っているので、当然のことです。

一方、次の文字列は有効な JSONであり、 http://jsonlint.com/を渡します

[
    {"Name": "Jack",
        "Id": "005b0000000MGa7AAA"},
    {"Name": "Jill",
        "Id": "005b0000000MGa7AAB"}
]

私の質問は次のとおりです。最初の入力を受け入れて解析して許可するにはどうすればよいですか。

parsed[0]['Name'] == 'Jane'
>> true

私の最初の本能は、キーを文字列に置き換えて(たとえば、名前を「名前」に)、それを解析してみることです。しかし、他の誰かが解決策を持っているなら、私は感謝しています。

4

2 に答える 2

18

これは、次の正規表現を少し置き換えることで実行できます。

var json = "[ {Name: 'Jane', Id: '005b0000000MGa7AAG'}, {Name: 'Tom', Id: '005b0000000MGa7AAF'} ]";

var newJson = json.replace(/([a-zA-Z0-9]+?):/g, '"$1":');
newJson = newJson.replace(/'/g, '"');

var data = JSON.parse(newJson);

alert(data[0]["Name"]);

まず、プロパティ名を引用符で囲み、次に一重引用符を二重引用符に置き換えます。これは、解析可能な有効な JSON にするのに十分です。

これが実際の例です


: このような目的で一般的に RegEx を使用することは理想的ではなく、このソリューションは特定の状況 (この例など) でのみ機能します。コメントで述べたように、1 つの問題は、データ値にコロンが含まれている場合です。:

それを念頭に置いて、これはより信頼性の高いソリューションです。

var json = $("div").html();

var newJson = json.replace(/'/g, '"');

newJson = newJson.replace(/([^"]+)|("[^"]+")/g, function($0, $1, $2) {
    if ($1) {
        return $1.replace(/([a-zA-Z0-9]+?):/g, '"$1":');
    } else {
        return $2; 
    } 
});

var data = JSON.parse(newJson);
alert(data[0]["Name"]);

これは、コロンで終わる任意の変数 (英数字) に:一致しますが、引用符の間にある一致 (つまり、データ文字列値) は無視されます。

ここに例があります

于 2013-04-25T11:54:26.167 に答える