【问题标题】:JMS Serializer, Symfony2, is it possible to serialize the JSON of several nested entities to one object?JMS Serializer,Symfony2,是否可以将多个嵌套实体的JSON序列化为一个对象?
【发布时间】:2015-07-12 02:33:20
【问题描述】:

我有 4 个相关的实体。

包 -> 有一个接收器 Package -> 有 PackageLines -> PackageLine 引用了 StockItem

是否可以序列化这个 JSON 数据。

进入包含所有其他实体的包实体?以干净高效的方式?

我对 JMS 序列化程序包进行了一些尝试,但运气不佳。

stock item 是引用的 stock item 的 id。

/**
 * Package
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\PackageRepository")
 * @ORM\HasLifecycleCallbacks
 *
 * @ExclusionPolicy("all")
 *
 */
class Package
{

    CONST STATUS_COMPLETED = "COMPLETED";
    CONST STATUS_PROCESSING = "PROCESSING";
    CONST STATUS_CANCELLED = "CANCELLED";
    CONST STATUS_ON_HOLD = "ON_HOLD";
    CONST STATUS_FAILED = "FAILED";
    CONST STATUS_ERROR = "ERROR";


    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Expose
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="IREnterprise\UserBundle\Entity\User", inversedBy="packages")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     **/
    private $user;

    /**
     * @ORM\ManyToOne(targetEntity="IREnterprise\AppBundle\Entity\Receiver", inversedBy="package", cascade={"all"})
     * @Assert\Valid()
     * @Expose
     **/
    private $receiver;

    /**
     * @ORM\OneToMany(targetEntity="IREnterprise\AppBundle\Entity\PackageLine", mappedBy="package", cascade={"all"})
     * @Assert\Valid()
     * @Expose
     **/
    private $packageLines;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="createdAt", type="datetime")
     * @Expose
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updatedAt", type="datetime")
     * @Expose
     */
    private $updatedAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="shippedAt", type="datetime", nullable=true)
     * @Expose
     */
    private $shippedAt;

    /**
     * @var string
     *
     * @ORM\Column(name="status", type="string", length=255, nullable=true)
     * @Expose
     */
    private $status;

    /**
     * @var string
     * @ORM\Column(name="deliveryNote", type="string", length=255, nullable=true)
     * @Expose
     */
    private $deliveryNote;


    public function __construct() {
        $this->setCreatedAt(new \DateTime('now'));
        $this->setPackageLines(new ArrayCollection());

        $this->setStatus(self::STATUS_PROCESSING);
    }

    ... getters & setters
}

接收者

/**
 * Receiver
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\ReceiverRepository")
 *
 * @ExclusionPolicy("all")
 *
 */
class Receiver
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\OneToMany(targetEntity="IREnterprise\AppBundle\Entity\Package", mappedBy="receiver", cascade={"all"})
     **/
    private $packages;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Assert\NotBlank()
     * @Expose
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="company", type="string", length=255, nullable=true)
     * @Expose
     */
    private $company;

    /**
     * @var string
     *
     * @ORM\Column(name="address1", type="string", length=255)
     * @Assert\NotBlank()
     * @Expose
     */
    private $address1;

    /**
     * @var string
     *
     * @ORM\Column(name="address2", type="string", length=255, nullable=true)
     * @Expose
     */
    private $address2;

    /**
     * @var string
     *
     * @ORM\Column(name="country", type="string", length=255)
     * @Assert\Country()
     * @Expose
     */
    private $country;

    /**
     * @var string
     *
     * @ORM\Column(name="zip_code", type="string", length=255)
     * @Assert\NotBlank()
     * @Expose
     */
    private $zipCode;

    /**
     * @var string
     *
     * @ORM\Column(name="city", type="string", length=255)
     * @Assert\NotBlank()
     * @Expose
     */
    private $city;

    /**
     * @var string
     *
     * @ORM\Column(name="phone", type="string", length=255, nullable=true)
     * @Expose
     */
    private $phone;

    /**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=255, nullable=true)
     * @Assert\Email()
     * @Expose
     */
    private $email;

    public function __construct() {
        $this->setPackages(new ArrayCollection());
    }
}

包装线

/**
 * PackageLine
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\PackageLineRepository")
 * @ORM\HasLifecycleCallbacks
 *
 * @ExclusionPolicy("all")
 *
 */
class PackageLine {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="IREnterprise\AppBundle\Entity\Package", inversedBy="package", cascade={"all"})
     * @ORM\JoinColumn(name="package_id", referencedColumnName="id")
     **/
    private $package;

    /**
     * @ORM\ManyToOne(targetEntity="IREnterprise\AppBundle\Entity\StockItem", inversedBy="stockitem", cascade={"all"})
     * @ORM\JoinColumn(name="stockitem_id", referencedColumnName="id")
     * @Expose
     **/
    private $stockItem;

    /**
     * @var integer
     *
     * @ORM\Column(name="quantity", type="bigint")
     * @Expose
     */
    private $quantity;
}

库存项目

/**
 * StockItem
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="IREnterprise\AppBundle\Entity\StockItemRepository")
 * @ORM\HasLifecycleCallbacks
 *
 * @ExclusionPolicy("all")
 *
 */
class StockItem
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Expose
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="IREnterprise\UserBundle\Entity\User", inversedBy="stockItems")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     **/
    private $user;

    /**
     * @var string
     *
     * @ORM\Column(name="barcode", type="string", length=255, nullable=true)
     */
    private $barcode;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     * @Expose
     * @Assert\NotBlank()
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="SKU", type="string", length=255)
     * @Expose
     * @Assert\NotBlank()
     * @Assert\Type(type="digit", message="The value {{ value }} is not a valid {{ type }}.")
     */
    private $SKU;

    /**
     * @var integer
     *
     * @ORM\Column(name="stockCount", type="bigint")
     * @Expose
     */
    private $stockCount = 0;

    /**
     * @var integer
     *
     * @ORM\Column(name="orderCount", type="bigint")
     * @Expose
     */
    private $orderCount = 0;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="createdAt", type="datetime")
     * @Expose
     */
    private $createdAt;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="updatedAt", type="datetime")
     * @Expose
     */
    private $updatedAt;

    public function __construct() {
        $this->setCreatedAt(new \DateTime('now'));
    }
}

【问题讨论】:

    标签: symfony jmsserializerbundle


    【解决方案1】:

    很有可能。看例子

       class Package
        { 
            /**
             * @Type("string")
             */
    
           private $id;
    
            /**
             * @Type("ArrayCollection<MyNamespace\Recevier>")
             */
           private $receiver;
       }
    
       class Receiver
        {
          /**
           * @Type("string")
           */
    
            private $id;
         }
    

    样本输出:

    {  
       "package":{  
          "id":"1",
          "receiver":{  
             "id":"1"
          }
       }
    }
    

    请看文档 http://jmsyst.com/libs/serializer/master/reference/annotations 我觉得对你很有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      相关资源
      最近更新 更多