2016-04-05 10 views
2

私の消費したXML APIには、応答の一部だけを取得するオプションがあります。 この機能を使用すると、結果として得られるオブジェクトは多くのNULLプロパティを持ちます。 NULLプロパティを実際にスキップする方法はありますか?JMSシリアライザのnullプロパティを除外

shouldSkipProperty(PropertyMetadata $property, Context $context)` 

で除外戦略を実装しようとしましたが、現在のプロパティ値にアクセスする方法がないことがわかりました。

例は、以下のクラスnull特性の多くでは、次のオブジェクトに、この特定のAPIコールにデシリアライズ

class Hotel { 
    /** 
    * @Type("string") 
    */ 
    public $id; 

    /** 
    * @Type("integer") 
    */ 
    public $bookable; 

    /** 
    * @Type("string") 
    */ 
    public $name; 

    /** 
    * @Type("integer") 
    */ 
    public $type; 

    /** 
    * @Type("double") 
    */ 
    public $stars; 

    /** 
    * @Type("MssPhp\Schema\Response\Address") 
    */ 
    public $address; 

    /** 
    * @Type("integer") 
    */ 
    public $themes; 

    /** 
    * @Type("integer") 
    */ 
    public $features; 

    /** 
    * @Type("MssPhp\Schema\Response\Location") 
    */ 
    public $location; 

    /** 
    * @Type("MssPhp\Schema\Response\Pos") 
    */ 
    public $pos; 

    /** 
    * @Type("integer") 
    */ 
    public $price_engine; 

    /** 
    * @Type("string") 
    */ 
    public $language; 

    /** 
    * @Type("integer") 
    */ 
    public $price_from; 
} 

あろう。

"hotel": [ 
    { 
     "id": "11230", 
     "bookable": 1, 
     "name": "Hotel Test", 
     "type": 1, 
     "stars": 3, 
     "address": null, 
     "themes": null, 
     "features": null, 
     "location": null, 
     "pos": null, 
     "price_engine": 0, 
     "language": "de", 
     "price_from": 56 
    } 
] 

しかし、私はあなたがそうのようなnull性質スキップするJMSシリアライザを構成することができ、それは

"hotel": [ 
    { 
     "id": "11230", 
     "bookable": 1, 
     "name": "Hotel Test", 
     "type": 1, 
     "stars": 3, 
     "price_engine": 0, 
     "language": "de", 
     "price_from": 56 
    } 
] 

答えて

3

になりたい:this issueから撮影

$serializer = JMS\SerializerBuilder::create();    
$serializedString = $serializer->serialize(
    $data, 
    'xml', 
    JMS\SerializationContext::create()->setSerializeNull(true) 
); 

を。

UPDATE:残念ながら

、デシリアライズし、それらを自分で削除する他の方法がないときは、空の性質をしたくない場合。

しかし、これらのプロパティを実際に削除したいというユースケースはわかりませんが、Hotelクラスには多くのロジックが含まれているようには見えません。この場合、結果はクラスでなければならないのだろうか?

私は、オブジェクトではなく連想配列としてデータを表現する方が自然だろうと思います。もちろん、JMSシリアライザはデータを配列に逆シリアル化できないため、データ転送オブジェクトが必要になります。

既存のHotelクラスにdumpArrayloadArrayメソッドを追加すれば十分です。これらは、データを目的の結果に変換したり、その逆に変換するために使用されます。あなたのDTOがあります。

/** 
* Sets the object's properties based on the passed array 
*/ 
public function loadArray(array $data) 
{ 
} 

/** 
* Returns an associative array based on the objects properties 
*/ 
public function dumpArray() 
{ 
    // filter out the properties that are empty here 
} 

私はそれが最もクリーンなアプローチであり、あなたが何をしようとしているのかを反映していると思います。

こちらがお役に立てば幸いです。

+0

私は実際にこれを試しましたが、シリアライゼーションではなく、デシリアライズでは機能しているようです。 –

+1

デシリアライズ時にnullプロパティをスキップする方法を教えてください。データがない場合はnullになります。 –

+0

本当に妥当な音です。だから私の唯一のオプションは、再帰的にすべてのnullプロパティをフィルタリングすることです私はデシリアライズされたオブジェクトを取得した後に? –

関連する問題