19

どうやら、無限大と NaN は JSON 仕様の一部ではないため、この PHP コードは次のようになります。

$numbers = array();
$numbers ['positive_infinity'] = +INF;
$numbers ['negative_infinity'] = -INF;
$numbers ['not_a_number'] = NAN;
$array_print = print_r ($numbers, true);
$array_json = json_encode ($numbers);
echo "\nprint_r(): $array_print";
echo "\njson_encode(): $array_json";

これを生成します:

PHP Warning:  json_encode(): double INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
PHP Warning:  json_encode(): double -INF does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8
PHP Warning:  json_encode(): double NAN does not conform to the JSON spec, encoded as 0 in /home/septi/test.php on line 8

print_r(): Array
(
    [positive_infinity] => INF
    [negative_infinity] => -INF
    [not_a_number] => NAN
)

json_encode(): {"positive_infinity":0,"negative_infinity":0,"not_a_number":0}

自分のjson_encode()関数を書かずにこれらの数値を正しくエンコードする方法はありますか? 多分いくつかの回避策?

4

5 に答える 5

13

あなたはJSON仕様について正しいです:

数字のシーケンスとして表現できない数値 (Infinity や NaN など) は許可されません。

カスタム「JSON」エンコーダーはいずれにしても有効な JSON を生成しないため、解決策も仕様から得られる必要があります (カスタム デコーダーも作成する必要があり、データの消費者は、それを使用することを余儀なくされます)。終了、時間切れ)。

仕様が値に許可するものは次のとおりです。

JSON 値は、オブジェクト、配列、数値、文字列、または次の 3 つのリテラル名のいずれかでなければなりません。

false null true

そのため、JSON に似たカスタム プロトコルの代わりに正当な JSON を使用する回避策には、数字の代わりに別のものを使用する必要があります。

合理的なオプションの 1 つは、文字列を使用すること"Infinity""NaN"、これらのエッジ ケースを使用することです。

于 2012-11-27T10:19:44.217 に答える
12

JSON 仕様によると、Infinity または NaN 値はありません: http://json.org/

回避策:

  1. JSON (純粋な JSON) を使用して拒否し、INF/NAN を処理する独自の json_encode 関数を記述し (それぞれ "Infinity" と "NaN" に変換)、result = eval('(' + json + ')');クライアント側でのようなものを使用して JSON を解析していることを確認します。

  2. IFN/NAN 値を文字列値 ('Infinity' および 'NaN') に事前に変換し、JavaScript でこれらの値を操作する場合は、次の構造を使用しますvar number1 = (+numbers.positive_infinity);Infinityこれにより、文字列値 'Infinity' が数値表現に変換されます。

于 2012-11-27T10:20:11.413 に答える
11

私の意見では、これは JSON の大きな欠点です。異なる JSON エンコーダーはこれを異なる方法で処理します。簡単な概要については、http: //lavag.org/topic/16217-cr-json-labview/?p=99058を参照してください。

1 つの解決策は、+inf を +1e9999 としてエンコードすることです。これは、ほとんどのデコーダーで +inf に自然にオーバーフローするためです。また、-inf を -1e9999 としてエンコードすることも同様です。NaN ははるかに難しいです。

于 2013-01-31T14:04:32.380 に答える
2

PHP >= 5.5.0 の新しいバージョンのこの質問の読者への更新として、まったく出力に失敗するのではなく、値を取得INFまたはエンコードするために、 JSON_PARTIAL_OUTPUT_ON_ERROR オプションを追加します。NANjson_encode0json_encode

例として:json_encode($data, JSON_NUMERIC_CHECK | JSON_PARTIAL_OUTPUT_ON_ERROR);

于 2017-07-26T14:35:17.217 に答える
0

上記の警告は、php ドキュメントで報告された公式のバグです。

https://bugs.php.net/bug.php?id=64695

于 2014-12-26T07:00:28.253 に答える