public function endVisitingObject(JMSClassMetadata $metadata, $data, array $type, Context $context)
 {
     $rs = parent::endVisitingObject($metadata, $data, $type, $context);
     if (empty($rs)) {
         return null;
     }
     $isSaveChanges = $context instanceof SaveChangesContextInterface;
     if ($this->isProxyObject($data) && ($isSaveChanges || !$data->__isInitialized())) {
         return null;
     }
     try {
         $doctrineMeta = $this->entityManager->getClassMetadata($metadata->name);
         if ($doctrineMeta) {
             $rs['$type'] = strtr($type['name'], '\\', '.');
             foreach ($doctrineMeta->associationMappings as $associationMapping) {
                 $foreignKey = $associationMapping['fieldName'] . 'Id';
                 if (isset($rs[$foreignKey])) {
                     continue;
                 }
                 $isScalar = in_array((int) $associationMapping['type'], array(ClassMetadata::ONE_TO_ONE, ClassMetadata::MANY_TO_ONE));
                 $isOwningSide = isset($associationMapping['isOwningSide']) ? $associationMapping['isOwningSide'] : false;
                 if (!($isScalar && $isOwningSide)) {
                     continue;
                 }
                 try {
                     $getter = 'get' . $associationMapping['fieldName'];
                     if (method_exists($data, $getter)) {
                         $association = $data->{$getter}();
                     } else {
                         $refl = new \ReflectionClass($data);
                         if ($this->isProxyObject($data)) {
                             $refl = $refl->getParentClass();
                         }
                         try {
                             $prop = $refl->getProperty($associationMapping['fieldName']);
                             $prop->setAccessible(true);
                             $association = $prop->getValue($data);
                         } catch (\ReflectionException $e) {
                         }
                     }
                     if ($association) {
                         try {
                             $id = $association->getId();
                             $rs[$foreignKey] = $id;
                         } catch (\Exception $e) {
                         }
                     }
                 } catch (\ReflectionException $e) {
                     //                    continue;
                 }
             }
         }
     } catch (\Exception $e) {
         return $rs;
     }
     return $rs;
 }
 /**
  * {@inheritdoc}
  */
 public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context)
 {
     $rs = parent::endVisitingObject($metadata, $data, $type, $context);
     /** @var JsonApiClassMetadata $jsonApiMetadata */
     $jsonApiMetadata = $this->metadataFactory->getMetadataForClass(get_class($data));
     if (null === $jsonApiMetadata) {
         return $rs;
     }
     $idField = $jsonApiMetadata->getIdField();
     if (empty($rs)) {
         $rs = new \ArrayObject();
         if (array() === $this->getRoot()) {
             $this->setRoot(clone $rs);
         }
         return $rs;
     }
     $result = array();
     if (isset($rs['type'])) {
         $result['type'] = $rs['type'];
     }
     if (isset($rs[$idField])) {
         $result['id'] = $rs[$idField];
     }
     $result['attributes'] = array_filter($rs, function ($key) use($idField) {
         switch ($key) {
             case $idField:
             case 'type':
             case 'relationships':
             case 'links':
                 return false;
         }
         return true;
     }, ARRAY_FILTER_USE_KEY);
     if (isset($rs['relationships'])) {
         $result['relationships'] = $rs['relationships'];
     }
     if (isset($rs['links'])) {
         $result['links'] = $rs['links'];
     }
     return $result;
 }
 /**
  * {@inheritdoc}
  */
 public function endVisitingObject(ClassMetadata $metadata, $data, array $type, Context $context)
 {
     $rs = parent::endVisitingObject($metadata, $data, $type, $context);
     if ($rs instanceof \ArrayObject) {
         $rs = [];
         $this->setRoot($rs);
         return $rs;
     }
     /** @var JsonApiClassMetadata $jsonApiMetadata */
     $jsonApiMetadata = $this->metadataFactory->getMetadataForClass(get_class($data));
     if (null === $jsonApiMetadata) {
         return $rs;
     }
     $result = array();
     if (isset($rs[JsonEventSubscriber::EXTRA_DATA_KEY]['type'])) {
         $result['type'] = $rs[JsonEventSubscriber::EXTRA_DATA_KEY]['type'];
     }
     if (isset($rs[JsonEventSubscriber::EXTRA_DATA_KEY]['id'])) {
         $result['id'] = $rs[JsonEventSubscriber::EXTRA_DATA_KEY]['id'];
     }
     $idField = $jsonApiMetadata->getIdField();
     $result['attributes'] = array_filter($rs, function ($key) use($idField) {
         switch ($key) {
             case $idField:
             case 'relationships':
             case 'links':
                 return false;
         }
         if ($key === JsonEventSubscriber::EXTRA_DATA_KEY) {
             return false;
         }
         return true;
     }, ARRAY_FILTER_USE_KEY);
     if (isset($rs['relationships'])) {
         $result['relationships'] = $rs['relationships'];
     }
     if (isset($rs['links'])) {
         $result['links'] = $rs['links'];
     }
     return $result;
 }