2013-11-28 4 views
5

मैं JSON मैन्युअल रूप से JMSSerializerBundle के साथ desirialize करना चाहता हूँ। मुझे हैंडलर कॉलबैक के साथ कुछ परेशानी मिली। यहां एक कोड है:जेएमएस सीरियलाइज़र मैन्युअल रूप से क्रमबद्धता को कैसे संभालें?

namespace Company\Bundle\Model; 

use JMS\Serializer\Annotation\Type; 
use JMS\Serializer\Annotation\SerializedName; 
use JMS\Serializer\Annotation\HandlerCallback; 
use JMS\Serializer\JsonDeserializationVisitor; 
use JMS\Serializer\DeserializationContext; 
use JMS\Serializer\TypeParser; 
use JMS\Serializer\Serializer; 

class Blog 
{ 
    protected $blogName; 

    protected $blogUrl; 

    protected $blogCategory; 
    /** 
    * @Type("array<Company\Bundle\Model\Post>") 
    * @SerializedName("data") 
    */ 
    protected $posts; 

    /** 
    * @param mixed $posts 
    */ 
    public function setPosts($posts) 
    { 
     $this->posts = $posts; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getPosts() 
    { 
     return $this->posts; 
    } 

    /** 
    * @HandlerCallback("json", direction = "deserialization") 
    */ 
    public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context) 
    { 
     $this->blogName = $data['data'][0]['blogName']; 
     $this->blogUrl = $data['data'][0]['blogUrl']; 
     $this->blogCategory = $data['data'][0]['blogCategory']; 

     $this->posts = ????; 
    } 
} 

मुझे इसके बजाय क्या जोड़ना चाहिए ???? वस्तु कंपनी \ बंडल \ मॉडल \ पोस्ट की सरणी प्राप्त करने के लिए

+0

केवल सरकारी उदाहरण/प्रलेखन यहां हैं: https://github.com/schmittjoh/serializer/blob/master/tests/JMS/Serializer/Tests/Fixtures/Article.php – Damien

उत्तर

2

हो सकता है कि इस तरह somthing:

/** 
* @HandlerCallback("json", direction = "deserialization") 
*/ 
public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context) 
{ 
    $this->blogName = $data['data'][0]['blogName']; 
    $this->blogUrl = $data['data'][0]['blogUrl']; 
    $this->blogCategory = $data['data'][0]['blogCategory']; 

    $this->posts = new ArrayCollection(); 
    for ($data['data'][0]['posts'] as $post_data){ 
     $this->posts->add(new Post($post_data)); 
     // OR 
     $this->posts->add(Post::deserializeFromJson($post_data)); 
    } 
} 
+0

मैंने कोशिश की लेकिन यह होगा नया खाली ऑब्जेक्ट $ यह बनाएं-> एडपोस्ट (नया पोस्ट ($ post_data)); यह $ यह-> एडपोस्ट (पोस्ट :: deserializeFromJson ($ post_data)); सही नहीं है क्योंकि ऐसी कोई स्थिर विधि नहीं है। – klipach

+0

दरअसल, आपको अपनी खुद की 'पोस्ट :: deserializeFromJson' विधि लिखना होगा :) –

+0

इस मामले में जेएमएस/सीरियलाइज़र का उपयोग करने का लाभ क्या है यदि मुझे अपनी deserializeFromJson विधि लिखनी चाहिए :) – klipach

2

आप वास्तव में अपने अन्य वस्तुओं, और स्थानीय एनोटेशन का फिर से उपयोग कर सकते हैं।

/** 
* @HandlerCallback("json", direction = "deserialization") 
*/ 
public function deserializeFromJson(JsonDeserializationVisitor $visitor, array $data, DeserializationContext $context) 
{ 
    $typeParser = new TypeParser(); 

    /** @var ClassMetadata $metadata */ 
    $metadata = $context->getMetadataFactory()->getMetadataForClass(self::class); 
    $visitor->startVisitingObject($metadata, $this, $typeParser->parse(self::class), $context); 

    $visitor->visitProperty($metadata->propertyMetadata['blogName'], $data['data'][0], $context); 
    $visitor->visitProperty($metadata->propertyMetadata['blogUrl'], $data['data'][0], $context); 
    $visitor->visitProperty($metadata->propertyMetadata['blogCategory'], $data['data'][0], $context); 
    $visitor->visitProperty($metadata->propertyMetadata['posts'], $data['data'][0], $context); 
} 
संबंधित मुद्दे