我试图使用ExclusionPolicy,但我不断得到"注释不存在,或无法自动加载"错误.
这是抛出的确切错误:
[语义错误] Acme\DemoBundle\Entity\Attributes类中的注释"@JMS\SerializerBundle\Annotation\ExclusionPolicy"不存在,或者无法自动加载.
我的代码如下:
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints;
use JMS\SerializerBundle\Annotation\ExclusionPolicy;
use JMS\SerializerBundle\Annotation\Expose;
/**
* Acme\DemoBundle\Entity\Attributes
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\AttributesRepository")
*
* @ExclusionPolicy("all")
*/
class Attributes
{
...
}
Run Code Online (Sandbox Code Playgroud) php data-annotations symfony fosrestbundle jmsserializerbundle
在User使用一个附加字段序列化实例时出现问题$name,这会从FOSUserBundle扩展基本用户:
<?php
namespace AppBundle\Entity\User;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
/**
* User
*/
class User extends BaseUser
{
/**
* @var string
*/
private $name;
/**
* Set name
* @param string $name
* @return User
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
* @return string
*/
public function getName()
{
return $this->name;
}
}
Run Code Online (Sandbox Code Playgroud)
为简化起见,我需要仅$salt使用用户实体公开字段JMSSerializerBundle
#AppBundle\Resources\config\serializer\Model.User.yml
FOS\UserBundle\Model\User:
exclusion_policy: all
properties:
salt: …Run Code Online (Sandbox Code Playgroud) 我有JMS序列化程序的问题.当我使用组时,JMS不会序列化我的子类,但是当我不使用组时,一切都没问题.我做错了什么?
$context = SerializationContext::create()->enableMaxDepthChecks();
$context->setGroups(['clientapi']);
$contextWithoutGroup = SerializationContext::create()->enableMaxDepthChecks();
/** @var Serializer $serializer */
$serializer = $this->container->get('jms_serializer');
$dataClientApi = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
$this->getUserFromParam($params), $folder, $categories, $tags
), 'json', $context);
$dataWithout = $serializer->serialize($documentBundle->getFolderDocumentsForClientApi(
$this->getUserFromParam($params), $folder, $categories, $tags
), 'json', $$contextWithoutGroup);
Run Code Online (Sandbox Code Playgroud)
给:
$dataClientApi = '{"0":{"author":{}}}';
$dataWithout = '{"0":{"author":{id: 2}}}';
Run Code Online (Sandbox Code Playgroud)
那是我的课程.家长:
/**
* Document
*
* @ORM\Table(name="documents")
* @ORM\Entity(repositoryClass="AppBundle\Entity\DocumentRepository")
* @ORM\EntityListeners({"DocumentListener"})
* @JMS\ExclusionPolicy("all")
* @JMS\AccessorOrder("custom", custom = {"id", "folderId", "title"})
*/
class Document implements ResourceInterface
{
use Traits\SortableTrait;
use Traits\TimestampableTrait;
/**
* @var integer
*
* …Run Code Online (Sandbox Code Playgroud) 我有一个基于Symfony 2.7 Framework构建的Rest API,带有FOSRestBundle和JMSSerializerBundle.我看看yml 参考和注释.
我已经选择定义我的模型的每个实体如何用yml序列化.
我已经看到我们可以Datetime按特定格式序列化对象:
@JMS\Type("DateTime<'d-m-Y'>")
Run Code Online (Sandbox Code Playgroud)
但我不知道yml定义使用的正确语法,我试过:
my_field:
expose: true
type: datetime
format: 'd-m-Y'
Run Code Online (Sandbox Code Playgroud)
和
my_field:
expose: true
type: datetime<'d-m-Y'>
Run Code Online (Sandbox Code Playgroud)
我不想使用,Annotations因为我有很多yaml文件.
但该领域尚未序列化 ......
有人可以帮帮我吗?
我正在使用JMSSerializer为我正在研究的Symfony2项目创建JSON响应,并尝试为每个响应构建单元测试,但我正在尝试以下变体:
JMS\Serializer\Exception\RuntimeException: You must define a type for FooBundle\Entity\Bar::$name.
Run Code Online (Sandbox Code Playgroud)
我正在为序列化器使用YML配置,它在生成响应时非常有效.
#src/FooBundle/Resources/config/serializer/Entity.Bar.yml
FooBundle\Entity\Bar:
exclusion_policy: none
properties:
id:
exclude: true
type: integer
name:
type: string
Run Code Online (Sandbox Code Playgroud)
我想知道是否需要以某种方式预加载配置并找到此链接:http: //jmsyst.com/libs/serializer/master/configuration,它说配置元数据路径但也包含文件后缀:
$serializer =
JMS\Serializer\SerializerBuilder::create()
->addMetadataDir($someDir)
->build();
Run Code Online (Sandbox Code Playgroud)
我在单元测试中生成序列化器时尝试设置config目录:
$serializer = SerializerBuilder::create()->addMetadataDir('path-to-dir')->build();
Run Code Online (Sandbox Code Playgroud)
但这并没有解决问题,我再次检查了文档页面,它告诉您列出文件的完整路径
"因此,如果您的类名为Vendor\Package\Foo,则元数据文件需要位于$ someDir/Vendor.Package.Foo.(xml | yml)."
但尝试得到生成:
JMS\Serializer\Exception\InvalidArgumentException: The directory "path-to-file" does not exist.
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗
谢谢
本
serialization phpunit serializer symfony jmsserializerbundle
我正在使用 JMS 来序列化和反序列化我的实体我有一个批处理来生成一个 json 文件和其他读取该文件
我的实体有一个 DateTime 字段,如下所示
/**
* @var \DateTime
*
* @ORM\Column(name="inscription_date", type="datetime", nullable=false)
* @JMS\Type("DateTime<'d/m/Y'>")
*/
private $inscriptionDate;
Run Code Online (Sandbox Code Playgroud)
当实体被序列化时,结果是
"inscription_date":"30\/05\/2007"
Run Code Online (Sandbox Code Playgroud)
但问题是当我要反序列化我得到
[JMS\Parser\SyntaxErrorException]
Expected end of input, but got "/" of type T_NONE at position 11 (0-based).
Run Code Online (Sandbox Code Playgroud)
注意:当我使用json_decode内置函数返回一个 stdClass 时没有问题
似乎不是这个字段,我删除了原始序列化的字段,但仍然出现相同的错误。每个对象都在一行中序列化,每个对象由 PHP_EOL 分隔
这是数据的样本 people.json
{"name":"dexter","date":"13/04/2009", "doc": "1047516320" }
{"name":"deedee","date":"30/05/2013", "doc": "1047516325" }
Run Code Online (Sandbox Code Playgroud)
所有字段均有效且数据类型为数字或字符串
我正在尝试使用Symfony 3和FOSRestBundle制作Rest Web服务。
我来自Spring + Jackson的背景,所以我正在努力做到这一点,以便您可以将对象作为请求主体传递给控制器,这些请求成为函数参数,并返回序列化为json的对象,到目前为止,我设法使其适用于一切除了数组。
这是我的代码:
组态:
#FOSRestBundle
fos_rest:
param_fetcher_listener: true
body_listener:
enabled: true
decoders:
json: fos_rest.decoder.json
format_listener:
rules:
- { path: ^/, priorities: [ json ], fallback_format: json, prefer_extension: true }
body_converter:
enabled: true
#validate: true
view:
mime_types:
json: ['application/json', 'application/json;version=1.0', 'application/json;version=1.1']
view_response_listener: 'force'
formats:
xml: false
json: true
templating_formats:
html: true
exception:
codes:
'Symfony\Component\Routing\Exception\ResourceNotFoundException': 404
'Doctrine\ORM\OptimisticLockException': HTTP_CONFLICT
messages:
'Symfony\Component\Routing\Exception\ResourceNotFoundException': true
allowed_methods_listener: true
access_denied_listener:
json: true
Run Code Online (Sandbox Code Playgroud)
这是控制器
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use JMS\DiExtraBundle\Annotation\Inject; …Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用 JMS\Serializer 并且我只想在其中的数组为空时忽略一个属性。
我试过类似的东西:
@JMS\Exclude(if="count('$this->required') === 0")
or
@JMS\Exclude(if="empty('required')")
Run Code Online (Sandbox Code Playgroud)
但出现语法错误。
谁可以帮我这个事?
谢谢。
所以我们JMSSerializerBundle在Symfony2项目中使用它为我们的客户生成一些JSON.它正在序列化我们的Doctrine2实体并且像魅力一样工作,但有一个例外.所有双精度/十进制值都是生成的JSON中的字符串,这使客户端感到困惑.
我们的序列化实体看起来像这样,我只在这里粘贴了相关的属性/ getter.
class Offer
{
[...]
/**
* @var double $latitude
*
* @ORM\Column(name="latitude", type="decimal", precision=10, scale=7)
* @Groups("offerlist")
*/
private $latitude;
/**
* @var double $longitude
*
* @ORM\Column(name="longitude", type="decimal", precision=10, scale=7)
* @Groups("offerlist")
*/
private $longitude;
[...]
/**
* Get latitude
*
* @return double
*/
public function getLatitude()
{
return $this->latitude;
}
/**
* Get longitude
*
* @return double
*/
public function getLongitude()
{
return $this->longitude;
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
纬度/经度值显示在JSON中,如下所示:
{
"latitude" : …Run Code Online (Sandbox Code Playgroud) 我发现这个线程提出了一种巧妙的方法来全局覆盖 config.yml 中的默认命名策略
但这是针对 symfony 3 而我在 symfony 4 上,所以我config > packages > jms_serializer.yaml将这行添加到我的,但这根本没有效果。
jms_serializer:
visitors:
xml_serialization:
format_output: '%kernel.debug%'
property_naming:
id: 'jms_serializer.identical_property_naming_strategy'
Run Code Online (Sandbox Code Playgroud)
有谁明白为什么?
我SerializerInterface $serializer使用序列化程序进行依赖注入,因为无法从AbstractControllerSF4 中调用服务。Controller在 SF4 中已弃用。