2

私たちの PHP アプリケーションは、mustache テンプレート ライブラリと組み合わせて、json_encode($myObject) を多用しています。それは素晴らしいです。

問題は、ajax リクエストから json データを返すときに、オブジェクトにデータが割り当てられていなくても、オブジェクトの構造全体が明らかになることです。簡単な例:

ajax 経由でユーザーをフェッチし、サーバーが json_encode($user) でオブジェクトを返すようにします

json:

"_userID":"1","_password":null,"_avatar":"0000723_8949d1d7eb0214fdf6c1af3cb6b66ed3_a.jpg","_blocked":null,"_confirmed":null,"_registerDate":null,"_lastVisitDate":null,"_template":null,"_referrerUserID":null,"_referrerURL":null,"_referrerDomain":null,"_referrerSearchTerms":null,"_confirmationHash":null,"_type":"Administrator"等々...

いくつかのフィールドだけを返したかったのですが、オブジェクトについて多くのことが明らかになりました。

明らかに、サーバー側のコードを書き直して、より制限された配列またはさまざまなオブジェクトを送り返すことができますが、実際には、それは人生を難しくし、サーバーと同じオブジェクトを処理するクリーンなテンプレート設計を妨げるものです。

json_encode からすべての null プロパティをクリアするにはどうすればよいですか? 他の誰かがこの問題と素敵できれいな解決策を持っていますか?

4

3 に答える 3

2

null 値を無視し、設定されているフィールドのみを返すようにサーバー側のコードを調整する必要があります (これにより、不要な帯域幅の使用を回避できます)。
クライアント側のコードでは、テンプレートのデフォルトのセットを用意し、受け取った JSON をデフォルトで拡張することをお勧めします。
jquery を使用している場合、コードは次のようになります。

var defaults ={someDay:"somePlace"};
var object = $.extend({},defaults,theJson);   

更新
し、php でオブジェクトを「クリーンアップ」するには、次のようなことができます。

foreach($obj as $k => $v)
    if($v == null)
        unset($obj[$k]);
于 2012-06-08T06:13:43.287 に答える
0

@gion_13 のおかげで、私は彼のコードを適応させ、完全な解決策を考え出しました:

$output = array('data'=>$data,'template'=>$template);
$output = object_unset_nulls($output);
echo json_encode($output);


function object_unset_nulls($obj)
  {
    $arrObj = is_object($obj) ? get_object_vars($obj) : $obj;
    foreach($arrObj as $key => $val)
    {
      $val = (is_array($val) || is_object($val)) ? object_unset_nulls($val) : $val;
      if (is_array($obj))
        $obj[$key] = $val;
      else
        $obj->$key = $val;
      if($val == null)
        unset($obj->$key);
    }
    return $obj;
  }
于 2012-06-11T02:52:07.823 に答える
0

オブジェクトと JSON を扱うときの私の経験から、各値を繰り返し処理しない方法はないと思います。クラス内に _toJson メソッドを実装し、JSON にエンコードする前に必要なすべての準備を行う方が良いと常に思っています (utf8 エンコードの問題、変数を直接呼び出す代わりにゲッターを使用するなど)。

于 2012-06-08T06:18:50.107 に答える