【问题标题】:How can I automatically map JSON to a case class when a field is a scala keyword?当字段是 scala 关键字时,如何自动将 JSON 映射到案例类?
【发布时间】:2018-03-16 10:05:35
【问题描述】:

Play Framework (2.6)中;我目前是 automatically mapping JSON 到 MongoDB 的案例类(使用 ReactiveMongo 0.12JSON 集合)。我已经下载了一个数据集 (here) 并将其作为 集合 导入到 MongoDB 中,以便进行一些与 地理空间查询 相关的测试。然而,其中一个字段被称为“type”(快速浏览一下,您会看到这个here)所以我遇到了问题,因为这是 Scala 中的关键字。否则我会这样写:

   case class Geometry(coordinates: List, type: String)
   case class Neighborhood(_id: Option[BSONObjectID], geometry: Geometry, name: String)

非常感谢您在这里提出任何建议!

只是添加(感谢@MarioGalic);将 scala 关键字 声明为类参数名称似乎是通过反引号完成的,但我仍然在 Play 模板中输出这些关键字 时遇到问题。因此,如果我遍历每个文档,我可能会写这个(这会出错)。

   @for(ngh <- neighborhoods){
     <tr>
        ...
        <td>@ngh.name</td>
        <td>@ngh.geometry.`type`</td>
        ...
     </tr>
   }

没有反引号在此处不起作用,并且在 模板 中无法识别带有反引号。我在this referenced question/answer on the subject 中找不到任何其他格式,所以我仍然遇到问题。谢谢


抱歉,这对于做什么是显而易见的。在 case 类模型 中,只需定义一个具有不同名称的方法(与本示例中的“type”不同,但本质上是任何导致问题的 keyword

   case class Geometry(coordinates: List, `type`: String) {
      def getType = `type`
   }

然后在模板中调用这个

   @for(ngh <- neighborhoods){
     <tr>
        ...
        <td>@ngh.name</td>
        <td>@ngh.geometry.getType</td>
        ...
     </tr>
   }

谢谢大家!

【问题讨论】:

    标签: json mongodb scala playframework reactivemongo


    【解决方案1】:

    您可以像这样用backticks 包装字段type

    case class Geometry(coordinates: List, `type`: String)
    

    以下答案更详细地解释了反引号语法: Need clarification on Scala literal identifiers (backticks)

    【讨论】:

    • 这是有道理的。唯一的问题是,在将信息拉入模板时它们没有帮助 - 请参阅上面我编辑的问题。再次感谢!
    • 解决了刚刚在问题中编辑过的这个问题。你的回答是这件事的催化剂。非常感谢!
    【解决方案2】:

    只需将您的代码包装在 花括号 中,如下所示:

    @{ngh.geometry.`type`}
    

    type 字段将在 Play 模板中正确呈现。无需创建getType 方法。

    您的完整工作代码是:

    @for(ngh <- neighborhoods){
       <tr>
         ...
         <td>@ngh.name</td>
         <td>@{ngh.geometry.`type`}</td>
         ...
       </tr>
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多