在 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?

在 Symfony2 中将多维数组转换为点表示法

如何在 Symfony2 中将 Json 绑定到实体中

如何在Symfony2中将json渲染成树枝

在 symfony 中反序列化对象返回异常 [关闭]

在没有 Microsoft.Office.Interop 的 .NET Core 中将 Word doc 和 docx 格式转换为 PDF