2012-01-06 4 views
5

私はWAMP環境でphp 5.2.6を使用しています。PHP json_decodeを使い果たして、非常に大きな整数値を変更しないようにするには?

json_decode関数を使用してjson文字列を配列にしようとしています。 JSONは他の場所でREST APIから取得しているため、JSON文字列の書式設定を制御することはできません。ここでは、使用しようとしているjson文字列の例を示します。

[{ 
    "webinarKey":795855906, 
    "sessionKey":100000000041808257, 
    "startTime":"2011-12-16T13:56:15Z", 
    "endTime":"2011-12-16T14:48:37Z", 
    "registrantsAttended":2 
}] 

ここでは特にsessionKey値の後です。 PHPはその値を浮動小数点として扱い、元の値を取得するために何もしないように見えます。

json_decode($json, true, 512, JSON_BIGINT_AS_STRING); 
# This produces the following error because my php version isn't up to snuff and I 
# can't upgrade to the version required 
# Warning: json_decode() expects at most 2 parameters, 4 given 

は、私もこれを試してみた:

は、私は、次の試した私が言ったように5.4をPHPへのアップグレード、

$json_obj = json_decode($json, true); 
number_format($json_obj[0]["sessionKey"], 0, '.', ''); 
# This results in precision issues where the value was 100000000041808257 
# but is number_formated out as 100000000041808256 

(4パラメータjson_decodeコールがサポートされている場合)オプションではありません。助けてください!

ありがとうございます!

+0

ここにはどこかに重複があると思いますが、それは検索する価値があるかもしれません –

+1

あなたはこの質問を見るかもしれません。 JSONが返された後、デコードされる前に、ソリューションをリストアップした人がいました。 http://stackoverflow.com/q/2907806/2863 –

答えて

3

ありがとう@Scott Gottreuと@pospi。

答えはthis questionの受け付けられた回答の最後のコメントにありました。

すべての整数値を引用符で囲むには、preg_replace()関数を使用します。

json_decode(preg_replace('/("\w+"):(\d+)/', '\\1:"\\2"', $jsonString), true); 

実際の値は非常にその問題を解決するように浮動小数点数でJSONを上記の行がそれネジをテストした後、私はちょうど引用符ですべての数値(整数または浮動小数点数)を囲むために、以下の使用しました品質JSONスペック使用することを

json_decode(preg_replace('/("\w+"):(\d+(\.\d+)?)/', '\\1:"\\2"', $jsonString), true); 
+2

あなたが負の数を扱っている場合は、正規表現でオプションとして '-'シンボルを追加してください: ' $ json = preg_replace( '/( "\ w + "):(:?\ d +(\。\ d +)?)/ '、' \\ 1:" \\ 2 "'、$ json)' – joserobleda

7

// wrap numbers 
$json = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $json); 
// as object 
$object = json_decode($json); 
// as array 
$array = json_decode($json, true); 
+0

これは私のために働く唯一のものでした+1 –

+2

これはありませんコロンと数字の文字列を含む破損したjson? – Phil

+0

Phil_1984_はい私はあなたが正しいと思います。具体的には、コロンとjson整数を持つ文字列です。私はそれが文字列ではなくプロパティであることを保証するために、コロンの前にエスケープされていない二重引用符をチェックする必要があると思います。 –

2

一方、PHPは何とか、よく...この問題を修正しました。 PHP 5.4ごろ出発し、彼らが行うオプションを追加しただけで上記掲載正規表現の解決策は何をすべきか:

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

512は、デフォルトの最大のネストの深さを指します。

関連する問題