如何管理 JMS Serializer 序列化规则
How to manage JMS Serializer serialization rules
我正在使用 xsd2php library to parse XSD which describes API request body. Then using the same library (which itself uses jsm-serializer) 我尝试序列化对象:
$payload = new TrackRequest;
$searchCriteria = new SearchCriteriaAType;
$searchCriteria->addToConsignmentNumber(11111);
$payload->setSearchCriteria($searchCriteria);
$levelOfDetail = new LevelOfDetailAType;
$levelOfDetail->setSummary(true);
$payload->setLevelOfDetail($levelOfDetail);
使用基本的序列化程序设置:
$serializerBuilder = SerializerBuilder::create();
$serializerBuilder->addMetadataDir(__DIR__ . '/../../metadata/Tracking', 'TNTExpressConnect\Tracking\XSD');
$serializerBuilder->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy);
$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
$serializerBuilder->addDefaultHandlers();
$handler->registerSubscribingHandler(new BaseTypesHandler()); // XMLSchema List handling
$handler->registerSubscribingHandler(new XmlSchemaDateHandler()); // XMLSchema date handling
});
序列化结果:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<searchCriteria>
<account/>
<alternativeConsignmentNumber/>
<consignmentNumber>
<entry><![CDATA[11111]]></entry>
</consignmentNumber>
<customerReference/>
<pieceReference/>
</searchCriteria>
<levelOfDetail>
<summary>true</summary>
</levelOfDetail>
</result>
关于这个结果我有几个问题:
- 为什么根元素是
<result>
而不是 <TrackRequest>
?
- 如何摆脱
CDATA
?
- 如何摆脱
<entry>
标签以支持为每个条目创建单独的 consigmentNumber
标签?
- 如何用自闭标签
<summary/>
替换<summary>true</summary>
我想对于每一种情况我都可以创建一个专用的 handler,但也许有一个内置的解决方案,我在文档中忽略了它(也许一些配置选项可以放在yaml).
如果我必须创建处理程序,也许有人可以向我指出更复杂的示例,它解释了如何正确地执行此操作。
我不太喜欢注释,所以我更愿意使用单独的配置文件。
提前致谢。
你应该看看 YAML Reference。元数据文件可以设置很多东西。
要将 "result" 更改为 "TrackRequest",请将此行添加到文件中:
Vendor\MyBundle\Model\ClassName:
xml_root_name: TrackRequest ## Changes the root element
要删除条目中的 cdata,请更改 属性:
properties:
entry:
xml_element:
cdata: false ## Add this to disable cdata tags
刚遇到和你一样的问题。希望对你有帮助。
我正在使用 xsd2php library to parse XSD which describes API request body. Then using the same library (which itself uses jsm-serializer) 我尝试序列化对象:
$payload = new TrackRequest;
$searchCriteria = new SearchCriteriaAType;
$searchCriteria->addToConsignmentNumber(11111);
$payload->setSearchCriteria($searchCriteria);
$levelOfDetail = new LevelOfDetailAType;
$levelOfDetail->setSummary(true);
$payload->setLevelOfDetail($levelOfDetail);
使用基本的序列化程序设置:
$serializerBuilder = SerializerBuilder::create();
$serializerBuilder->addMetadataDir(__DIR__ . '/../../metadata/Tracking', 'TNTExpressConnect\Tracking\XSD');
$serializerBuilder->setPropertyNamingStrategy(new IdenticalPropertyNamingStrategy);
$serializerBuilder->configureHandlers(function (HandlerRegistryInterface $handler) use ($serializerBuilder) {
$serializerBuilder->addDefaultHandlers();
$handler->registerSubscribingHandler(new BaseTypesHandler()); // XMLSchema List handling
$handler->registerSubscribingHandler(new XmlSchemaDateHandler()); // XMLSchema date handling
});
序列化结果:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<searchCriteria>
<account/>
<alternativeConsignmentNumber/>
<consignmentNumber>
<entry><![CDATA[11111]]></entry>
</consignmentNumber>
<customerReference/>
<pieceReference/>
</searchCriteria>
<levelOfDetail>
<summary>true</summary>
</levelOfDetail>
</result>
关于这个结果我有几个问题:
- 为什么根元素是
<result>
而不是<TrackRequest>
? - 如何摆脱
CDATA
? - 如何摆脱
<entry>
标签以支持为每个条目创建单独的consigmentNumber
标签? - 如何用自闭标签
<summary/>
替换<summary>true</summary>
我想对于每一种情况我都可以创建一个专用的 handler,但也许有一个内置的解决方案,我在文档中忽略了它(也许一些配置选项可以放在yaml).
如果我必须创建处理程序,也许有人可以向我指出更复杂的示例,它解释了如何正确地执行此操作。
我不太喜欢注释,所以我更愿意使用单独的配置文件。
提前致谢。
你应该看看 YAML Reference。元数据文件可以设置很多东西。
要将 "result" 更改为 "TrackRequest",请将此行添加到文件中:
Vendor\MyBundle\Model\ClassName: xml_root_name: TrackRequest ## Changes the root element
要删除条目中的 cdata,请更改 属性:
properties: entry: xml_element: cdata: false ## Add this to disable cdata tags
刚遇到和你一样的问题。希望对你有帮助。