1

json_decode でデコードされた big int に典型的な問題があり、JSON_BIGINT_AS_STRINGオプションを使用してみましたが、php がパラメーターを無視しているようです。

私はphp.netのサンプルコードを試しました:

$json = '12345678901234567890';

var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));

出力は次のようになります。

float(1.2345678901235E+19)
string(20) "12345678901234567890"

しかし、私のサーバー(xampp php 5.4.7)には次のものがあります:

float(1.2345678901235E+19)
float(1.2345678901235E+19)

助けてくれてありがとう!

4

1 に答える 1

1

編集:

これを確認する必要がありましたが、この動作は PHP のバグとして分類されています。詳細については、バグ レポートを参照してください。

既存の動作により、文字列がPHP によって内部的にint/float (数値型) としてキャストされます。JSON でエンコードされたオブジェクト、配列、または文字列を提供すると、関数は説明どおりに動作しますが、現時点では、これはバグのある動作を反映しています。

$json = '12345678901234567890';

var_dump(json_decode($json));           /* float(1.2345678901235E+19) */
var_dump(json_decode($json, false, 512, 
         JSON_BIGINT_AS_STRING));       /* float(1.2345678901235E+19) */

ご覧のとおり、どちらも float を返しますが、有効な JSON オブジェクト、配列、または有効な JSON を文字列として使用すると、期待どおりの結果が得られます。

$jsonStr = '"12345678901234567890"';        // as a string
$jsonArr = '[12345678901234567890]';        // as an array
$jsonObj = '{"num":12345678901234567890}';  // as an object

var_dump(
         json_decode($jsonStr), /* It's JSON_BIGINT_AS_STRING by default in 5.4 */
         json_decode($jsonArr),
         json_decode($jsonArr, false, 512, JSON_BIGINT_AS_STRING),
         json_decode($jsonObj),
         json_decode($jsonObj, false, 512, JSON_BIGINT_AS_STRING)
);

出力は次のようになります...

string(20) "12345678901234567890"
array(1) {
  [0]=>
  float(1.2345678901235E+19)
}
array(1) {
  [0]=>
  string(20) "12345678901234567890"
}
object(stdClass)#1 (1) {
  ["num"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#2 (1) {
  ["num"]=>
  string(20) "12345678901234567890"
}

これはすぐに修正されるはずですが、今のところ、この新しい情報を反映するように回答を更新したかっただけです。

于 2012-12-11T10:20:29.850 に答える