30

次のように、リテラル NaN を含む JSON データ文字列を受け取る node.js アプリを用意します。

 "[1, 2, 3, NaN, 5, 6]"

JSON.parse(...)これは Node.js でクラッシュします。できれば、オブジェクトに解析したいと思います。

NaNJSON仕様の一部ではないことは知っています。ほとんどのSOリンク(jsonでNaNを送信)は、出力を修正することを提案しています。

ここでは、データは私が制御していないサーバーで生成されますが、ソース コードを表示できる商用 Java ライブラリによって生成されます。また、Google の Gson ライブラリによって生成されます。

private Gson gson = (new GsonBuilder().serializeSpecialFloatingPointValues().create()); 
... 
gson.toJson(data[i], Vector.class, jsonOut)

だから、それは正当な情報源のようです。そしてGson API Javadocによると、それを解析できるはずだと言っています:

JSON 仕様のセクション 2.4 では、特殊な double 値 (NaN、Infinity、-Infinity) は許可されていません。ただし、Javascript 仕様 (セクション 4.3.20、4.3.22、4.3.23 を参照) では、これらの値を有効な Javascript 値として許可しています。さらに、ほとんどの JavaScript エンジンは、これらの特別な値を JSON で問題なく受け入れます。そのため、実用的なレベルでは、JSON 仕様で許可されていなくても、これらの値を有効な JSON として受け入れることは理にかなっています。

それにもかかわらず、これは Node.js と Chrome の両方で失敗します。 JSON.parse('[1,2,3,NaN,"5"]')

JSON.parse() に設定するフラグはありますか? NaNまたは、リテラルとして受け入れる代替パーサーですか?

私はしばらくの間グーグルをしてきましたが、この問題に関するドキュメントが見つからないようです。

PHP: 無限数または NaN 数を JSON にエンコードする方法は?

4

5 に答える 5

51

次のような、リテラル NaN を含む JSON データ文字列を受け取る node.js アプリを用意します。

次に、NodeJS アプリJSONを受信して​​いません。漠然と JSON に似たテキストを受信して​​います。NaNは有効な JSON トークンではありません。

3 つのオプション:

1. ソースを取得して JSON を正しく生成する

これは明らかに優先コースです。データは JSON ではありません。修正する必要があります。これにより、問題が修正されます。

2.NaNシンプルな方法で容認する:

null解析する前に、次のように置き換えることができます。

var result = JSON.parse(yourString.replace(/\bNaN\b/g, "null"));

...そしてnull、結果の s を処理します。しかし、それは非常に単純なことでありNaN、文字列のどこかに文字が現れる可能性を考慮していません。

または、Matt Ball のreviverアイデア(現在は削除されています) を回転させて、それを特別な文字列 ( など"***NaN***") に変更し、リバイバーを使用してそれを実際の に置き換えることができNaNます。

var result = JSON.parse(yourString.replace(/\bNaN\b/g, '"***NaN***"'), function(key, value) {
    return value === "***NaN***" ? NaN : value;
});

NaN...しかし、キャラクターが適切な場所に表示されないと仮定すると、少し単純であるという同じ問題があります.

3.使う(身震い!) eval

このデータのソースを知っていて信頼でき、転送中に改ざんされる可能性がない場合は、 の代わりに を使用evalして解析JSON.parseevalを含む完全な JavaScript 構文を使用できるためNaN、これは機能します。非常に、非常に、非常に小さな状況でのみこれを推奨することを人々が理解できるように、警告を十分に太字にしたことを願っていただし、繰り返しにevalが、コードの任意の実行が許可されるため、文字列が改ざんされている可能性がある場合は使用しないでください。

于 2013-03-05T16:13:18.163 に答える
6

数学的または業界データを扱う場合、NaNは非常に便利です (多くの場合、無限も便利です)。IEEE754 以降の業界標準です。

そのため、一部のライブラリ、特に GSON では、生成される JSON にそれらを含めることができ、標準的な純度が失われ、健全性が増します。

複雑な動的オブジェクトを交換する場合、実際のプロジェクトで復活と正規表現のソリューションを確実に使用することはできません。

またeval、問題もあります。その 1 つは、JSON 文字列が大きい場合に IE でクラッシュする傾向があるという事実であり、もう 1 つはセキュリティ リスクです。

そのため、特定のパーサー (本番環境で使用) を作成しました: JSON.parseMore

于 2014-04-25T06:51:35.160 に答える
5

JSON5ライブラリを使用できます。プロジェクトページからの引用:

JSON5 Data Interchange Format (JSON5) は JSON のスーパーセットであり、ECMAScript 5.1 からのいくつかのプロダクションを含むように構文を拡張することにより、JSON の制限の一部を緩和することを目的としています。

この JavaScript ライブラリは、JSON5 の解析およびシリアル化ライブラリの公式リファレンス実装です。

ご想像のとおり、特に NaN の解析をサポートしています (Python などによるシリアライズ方法と互換性があります)。

JSON5.parse("[1, 2, 3, NaN, 5, 6]")
> (6) [1, 2, 3, NaN, 5, 6]
于 2018-11-07T09:59:53.883 に答える
0

正しい解決策は、パーサーを再コンパイルし、"allowNan" ブール値フラグをソース ベースに提供することです。これは他のライブラリが持っている解決策です(pythonが思い浮かびます)。

優れた JSON ライブラリは、適切なフラグが設定された JSON に漠然と似ているほぼすべてのものを寛容に解析します (perl の JSON.pm は非常に柔軟です)... しかし、メッセージを書き込むときは、標準の JSON を生成します。

IE: あなたが見つけたときよりも部屋をきれいにしておいてください。

于 2015-03-11T19:36:41.640 に答える