在 Symfony 中将 JSON 转换为 Doctrine 实体
Posted
技术标签:
【中文标题】在 Symfony 中将 JSON 转换为 Doctrine 实体【英文标题】:Converting JSON to Doctrine Entity in Symfony 【发布时间】:2016-06-18 21:54:36 【问题描述】:我目前正在使用 Symfony 框架构建 API。我已经完成了足够的阅读以了解如何使用序列化组件,并为我的实体构建了一些自定义规范化器。它目前的工作方式是:
JSON -> 数组(解码)-> 用户实体(非规范化)
只要请求内容是用户的 JSON 表示,这就是有效的查找,例如:
"email": "demouser@email.com",
"plainPassword": "demouser",
"first_name" : "Demo",
"last_name" : "User"
在我的控制器中使用以下代码创建用户实体:
$newuser = $this->get('api.serializer.default')->deserialize($request->getContent(), WebsiteUser::class, 'json');
但是,我想将用户 JSON 嵌套在 JSON 对象的“数据”属性中,这将允许消费者在请求中传递额外的元数据,例如:
"options": [
"foo": "bar"
],
"data": [
"email": "demouser@email.com",
"plainPassword": "demouser",
"first_name": "Demo",
"last_name": "User"
]
这导致的主要问题是反序列化不成功,因为 JSON 格式发生了变化。
到目前为止,我考虑的唯一解决方案是 json_decode 整个请求正文,获取该数组的“数据”元素,并将数据元素的内容传递给反规范化器(而不是反序列化器)。
有没有更好的方法来解决这个问题?
【问题讨论】:
【参考方案1】:您应该能够获得请求正文的特定密钥,如下所示:
$newuser = $this->get('api.serializer.default')->deserialize(
$request->request->get('data'), WebsiteUser::class, 'json'
);
如果您在不解码请求正文的情况下无法从键中检索数据,请查看this bundle,它仅包含一个 EventListener,它在解码后替换请求正文。
您可以轻松地将相同的逻辑集成到您的应用程序中,或者直接需要捆绑包(效果很好)。
【讨论】:
以上是关于在 Symfony 中将 JSON 转换为 Doctrine 实体的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Symfony 2.0 AJAX 应用程序中将 Doctrine 实体编码为 JSON?
在没有 Microsoft.Office.Interop 的 .NET Core 中将 Word doc 和 docx 格式转换为 PDF