1

ブラウザのJavascript、iPhoneおよびAndroidアプリによって解析されるJSONデータを出力するPHPスクリプトがあります。

以前、PHPが配列データをJSONに変換すると、二重引用符で示されているように、すべての数値が文字列に変換されることがわかりました。したがって、たとえば、"id" : 1になり"id" : "1"ます。これは、JSONデータを受信するJavascript関数の一部を混乱させるように思われたため、数値が文字列に変換されないようにするために、PHPのJSONでこの正規表現を実行しました。

$JSONOutput = preg_replace('/"(-?\d+\.?\d*)"/', '$1', json_encode($JSONOutput));

ただし、これにはキーと値の両方から二重引用符を削除する効果もあるため、に1 : "first value"なり"1" : "first value"ます。JSONキーが文字列でない場合、データを受信するiPhoneアプリが文句を言うため、これが問題であることがわかります。

したがって、私がやりたいのは、JSONのすべての値が整数として保持されていることを確認することですが、すべてのキーは文字列になっています。上記の正規表現を値だけで実行する方法はありますか?または、同様の結果が得られる他のプロセスはありますか?

4

1 に答える 1

2

上記の正規表現を値だけで実行する方法はありますか?

文字列の後処理は避けたほうよいでしょう。

以前、PHP が配列データを JSON に変換すると、二重引用符で示されるようにすべての数値が文字列になることがわかりました。たとえば、"id" : 1 は "id" : "1" になります。

ここでの答えは、数値が実際に数値であることを確認することです。数値が必要な場所に数字を含む文字列が表示される場合は、PHP オブジェクト/配列の値が数値ではないためです。それはあなたが修正する必要があるものです。

たとえば、次のコード:

<?php
    header('Content-Type: application/json');
    $x = array(
        "number" => 1,
        "string" => "2"
        );
    echo json_encode($x);
?>

...次の出力が正しく生成されます。

{"number":1,"string":"2"}

PHP コードでは実際には数値である値が、JSON では数値と​​して出力されることに注意してください。

したがって、文字列を後処理するのではなく、入力するデータを修正するのが答えですjson_encode


以下のコメントに返信します。

文字列名をキーに具体的に割り当てることができることは理解していますが、問題の配列は数値を追加し続けるwhileループで自動的に生成され、それらの数値はカウント操作に使用されるため、私の場合はうまくいかないと思います.

少しの違いもありません。たとえば、次のコード:

<?php
    header('Content-Type: application/json');
    $x = array();
    for ($n = 1; $n < 5; ++$n) {
       $x["entry" . $n] = $n;
    }
    echo json_encode($x);
?>

次の出力が生成されます。

{"entry1":1,"entry2":2,"entry3":3,"entry4":4}

ここでも、数値は入力の数値であり、したがって出力の数値であることに注意してください。

また、オブジェクトのキーが数値の場合、PHP はそれを正しく処理することに注意してください。

<?php
    header('Content-Type: application/json');
    $x = array();
    $x["foo"] = "bar";
    for ($n = 1; $n < 5; ++$n) {
       $x[$n] = $n * 2;
    }
    echo json_encode($x);
?>

生産する

{"foo":"bar","1":2,"2":4,"3":6,"4":8}
于 2013-01-06T07:33:31.663 に答える