2016-12-29 3 views
0

json_encodeビルトインでJSONにシリアル化されるクラスがあります。しかし、このオブジェクトがエンコードされるとき、私はそのオブジェクトの特定の属性を別々にエンコードすることを望みます。たとえば、次のコードでは、プロパティを小文字の名前でエンコードする(Valueは値になります)。json_encodeの方法をカスタマイズして、オブジェクトをエンコードすることは可能ですか?

class MyClassName 
{ 
    public $Value; 
    public $OtherValue; 
} 
+0

他の方法は、あなたが –

+0

にエコー-INGの前に、オブジェクトの最初の文字を小文字にJSONの利用機能を受信したときにそのような機能があり、可能性'strtolower'のようにクラスに' toArray'のようなメソッドを追加するオプションがあります。これはエンコーディングなどのためにプロパティを返すものです。あなたがする必要があるのは、あなたが必要としている方法でデータを収集し、奇跡や単純な機能からの読解を期待することはありません。 –

+0

@ N.B。いずれかの問題は、変数名を小文字にしたくないということです。だから私は単純に変数を小文字にすることはできません。 – UnkwnTech

答えて

3

JsonSerializableインターフェイスについて読んでください(クラスで実装されています)。あなたのクラスがインタフェースを実装している場合、それはクラスのインスタンスをエンコードする必要があるとき

class MyClassName implements JsonSerializable 
{ 
    public $Value; 
    public $OtherValue; 

    public function jsonSerialize() 
    { 
     return array(
      'value' => $this->Value, 
      'otherValue' => $this->OtherValue, 
     ); 
    } 
} 

は、json_encode()方法jsonSerialize()を呼び出します。

このメソッドは配列を返さなければならず、その配列はそれを生成したインスタンスの代わりにjson_encode()でエンコードされます。

jsonSerialize()メソッドから任意のものを返すことができます。プロパティを省略したり、クラスに存在しないプロパティを作成したり、値を計算したりすることができます。

json_decode()で使用する逆の方法はありません。 PHPオブジェクトのクラスはJSON表現でエンコードされていないため、json_encode()はオブジェクト(または結合配列)をstdClassだけ作成できます。そのようなデコード方法は役に立たない。

しかし、デコード時には、配列またはstdClassオブジェクトをクラスのコンストラクタに渡すのが簡単です。または、デコードされたデータを使用してオブジェクト状態を復元できる初期化メソッドに簡単に渡すことができます。

+0

このメソッドを使用すると、結果のJSONデータはオブジェクトとしてオブジェクトを表しますか、それとも配列に変換されますか? – UnkwnTech

+0

配列に数値の正のキーと連続するキーが「0」で始まる場合は、配列としてJSONにエンコードされます。そうでなければ(文字列キー、ギャップ、 '0'で始まらない)、オブジェクトとしてエンコードされます。これは、JSONはJavaScriptのサブセットであり、Javascript配列は数字キーしか持たないからです。配列キーはJSONでコード化されていません(そのため、数値、正数、連続し、 '0 'で始まる必要があります)。特定の質問に答えるために、私が回答に投稿したサンプルコードから返された配列は、JSONの配列としてエンコードされています。 – axiac

2

PHPは、まさにこの目的のためにJsonSerializableインタフェースを提供します:

class MyClassName implements JsonSerializable 
{ 
    public $Value; 
    public $OtherValue; 

    function jsonSerialize() 
    { 
     return array_change_key_case((array) $this, CASE_LOWER); 
    } 
} 
関連する問題