2017-06-08 3 views
0

アクメ\ StoreBundle \ドキュメント\人は - タイプ "アクメ StoreBundle ドキュメント GPS" の引数期待、 "アレイ"

/** 
* @MongoDB\Document 
*/ 

class Person 
{ 

/** 
* @MongoDB\bool 
*/ 

private $hasemail; 

/** 
* @MongoDB\EmbedOne(targetDocument="Gps") 
*/ 

private $gps; 

/** 
* @MongoDB\Field(name="email", type="collection") 
*/ 

private $email; 

} 
... 

アクメ\ StoreBundle \ドキュメント\を与えられましたJSONにMongoのドキュメントをシリアライズGPS

/** 
* @MongoDB\EmbeddedDocument 
*/ 

class Gps 
{ 

/** 
* @MongoDB\Field(type="float") 
*/ 

private $latitude; 


/** 
* @MongoDB\Field(type="float") 
*/ 
private $longitude; 

} 
... 

のmongo JSONドキュメント

{ 
"hasemail": true, 
"gps": { 
    "latitude": 42.941579990394, 
    "longitude": -85.244641161525 
}, 
"email": [ 
    "[email protected]", 
    "[email protected]", 
    "[email protected]" 
] 
} 

は完璧に動作します。 「タイプ 『アクメ\ StoreBundle \ドキュメント\のGPS』の期待される引数、 『配列』与えられた」

デシリアライズコード:

$post = $request->getContent(); 
$serializer = $this->get('serializer'); 
$person = $serializer->deserialize($post, Person::class, 'json'); 

答えて

0

$postは、おそらく配列であるあなたが、文書にJSONをデシリアライズすると、エラーがスローされますあなたが期待している生のJSONオブジェクトではありません。

[{ 
    key: value 
}] 

が..

{ 
    key: value 
} 

別に異なっている、あなたのエラーメッセージが表示され、あなたがここにあるサンプルコードに基づいて、別の問題があるように見えます。

Acme\StoreBundle\Document\Gpsが予想されるクラスですが、Voter::classをデシリアライズしているので、名前空間とクラス名も確認してください。

+0

ポストは、JSONオブジェクトである - ない配列。クラスが正しい - ここで名前を変更するのを忘れてしまった。 –

+0

jsonオブジェクトまたはjson配列はPHP配列に変換されます。この問題は、json_decodeが配列をPerson :: classに変換しようとした後に発生します。デシリアライザがオブジェクトの埋め込みや型の不一致に対して機能していませんか?どのように修正する? –

+0

https://stackoverflow.com/questions/40033732/denormalize-nested-structure-in-objects-with-symfony-2-serializer – jeremy

1

最後にReflectionExtractorを使用しましたが、それは魅力的に機能しました。カスタム非正規化は必要ありません。

http://symfony.com/doc/current/components/serializer.html#recursive-denormalization-and-type-safety

$post = $request->getContent(); 

    $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor()); // 

    $serializer = new Serializer(array($normalizer, new DateTimeNormalizer(\DateTime::ISO8601), new ObjectNormalizer()), [new JsonEncoder()]); 


    $person = $serializer->deserialize($post, Person::class, 'json'); 

    $dm = $this->get('doctrine_mongodb')->getManager(); 
    $dm->persist($person); 
    $dm->flush(); 

    return new Response('Created id ' . $person->getId()); 
関連する問題