如何在Rails中反序列化非标准的JSON请求?(非 JSONAPI)

How to deserialize a non standard JSON request in Rails? (non-JSONAPI)

提问人:DariusP 提问时间:11/6/2023 更新时间:11/6/2023 访问量:41

问:

在 Rails 应用程序中,我收到一个跟踪模型的 JSON 请求。我需要将所有这些保存到数据库中。 我不确定如何处理控制器的此输入。Order

JSON 请求正文采用以下格式:

{
  "OrderID": "00023-00001",
  "OrderType": "Delivery",
  "DateTimes": {
    "DeliverDueDateTime": "2024/03/17 20:00:00"
  },
  "Area": {
    "Code": {
      "ZipCode": "1111",
      "AdditionalCodes": {
        "ZipCode": [
          "2111",
          "3111"
        ]
      }
    }
  }
}

这与我习惯的格式不同(对这个框架来说仍然是新的)。

我发现的大多数教程都使用蛇形大小写的 JSON 键,在根目录中有 or,并且不包含嵌套数据。通常,我会这样做.但这里有点不同。orderdataparams.require(:order).permit(:request_number, ...)

此 JSON 不同,因为:

  • 它有嵌套键
  • 根目录下没有任何内容
  • 有 Pascal 大小写键

我应该如何处理?

我检查了 ActiveModel 序列化程序,但在这种情况下它似乎不提供反序列化。除非我错过了什么。

https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/deserialization.md

我尝试了以下方法:

params.permit(:OrderID, :OrderType, :Area)

params.permit(:OrderID, :OrderType).require(:Area).permit(:Code)

params.permit(:OrderID, :OrderType).require(:Area)

# ActionController::ParameterMissing: param is missing or the value is empty: Area
Ruby-on-Rails Ruby JSON 反序列化 强参数 ActionController

评论

0赞 max 11/6/2023
ActiveController::Parameters不会以任何方式更改传入参数键的大小写,也不关心。使用 snake case 只是 rails 的惯例。它实际上只是一个类似哈希的对象,您可以使用或拉出给定的密钥并将其切片。fetchrequirepermit
0赞 max 11/6/2023
允许嵌套键是通过传递哈希参数来完成的。不过,您可能想要做的是创建一个对象,负责反序列化与模型分开的请求。
0赞 max 11/6/2023
这可以是一个普通的旧 ruby 对象,它将参数作为输入,并输出与您的内部表示相对应的规范化版本。这避免了在您的应用程序与连接到它的疯狂客户端之间创建紧密耦合。
0赞 max 11/6/2023
此外,ActiveModel::Serializers 实际上可用于序列化/反序列化几乎任何内容。您链接到的文档是另一个将其用于 jsonapi.org 的宝石。然而,它并没有真正使这项工作比简单的 PORO 简单得多。
0赞 spickermann 11/6/2023
您期望或需要哪种控制器输出格式?

答: 暂无答案