1

これが、JSへのJSON応答を構築するための基礎です。

$this->_response['vendor'] = array();

foreach ($_results as $_row) {
    $this->_response['vendor'][$_row['id']] = $_row;
}

echo(json_encode($this->_response));

これは問題なく、結果がない場合を除いて、JavaScriptでオブジェクトを問題なくビルドします。その場合、phpはそれを連想配列ではなく空の数値配列と見なします。次に、これはjavascriptになり、空のオブジェクトではなく空の配列に変換されます。

これは、チェックしたり、JavaScriptでオブジェクトとして変数を事前に宣言したりするなど、さまざまな方法で修正できることを知っています。PHPで空の連想配列を宣言する方法があるかどうか、またはその他の方法があるかどうか疑問に思います。代わりに、json_encodeにオブジェクト( "{}")を作成させる。

4

2 に答える 2

0

これは PHP の既知の制限です。JavaScript の型 (オブジェクトなど) をネイティブにサポートしていないため、デコードしてから再度エンコードすると、データが失われる可能性があります。

JSONをそのまま維持するために、次のような回避策を使用します。

/**
 * @param $input
 * @return array
 */
public static function safeDecode($input) {
    // Fix for PHP's issue with empty objects
    $input = preg_replace('/{\s*}/', "{\"EMPTY_OBJECT\":true}", $input);

    return json_decode($input, true);
}

/**
 * @param array|object $input
 * @return string
 */
public static function safeEncode($input) {
    return preg_replace('/{"EMPTY_OBJECT"\s*:\s*true}/', '{}', json_encode($input));
}

理想的ではありませんが、機能します。次のことができることに注意してください。

  • これはデフォルトの方法です。その後、空のオブジェクトは失われませんが、ほとんどのコレクション操作ツールは配列で動作するため、最新のフレームワークのほとんどは配列を必要とします。したがって、ほとんどの場合、これは実行可能なオプションではありません。
  • 空の配列をオブジェクトにエンコードするように json_encode() を強制することもできますが、空の配列が失われます - どちらも良いオプションではありません。

したがって、上記のような回避策が、おそらく現時点で唯一の選択肢です。つまり、PHP の json_encode() と json_decode() を拡張する必要があります。残念ながら、PHP では組み込み関数のオーバーロードが許可されていないため、別の名前で関数を定義する必要があります。

于 2016-11-17T01:54:36.207 に答える
-1

ここでの最も合理的な答えは、そもそも空の配列またはオブジェクトを配信してもおそらく意味がないということだと思います。JavaScript に存在するかどうかの簡単なチェックで、問題を処理できます。

if (count($_results)) {

    $this->_response['vendor'] = array();

    foreach ($_results as $_row) {
        $this->_response['vendor'][$_row['id']] = $_row;
    }
}
echo(json_encode($this->_response));
于 2012-12-14T03:05:45.167 に答える