当字段是scala关键字时,如何自动将JSON映射到案例类?

时间:2017-10-04 21:34:16

标签: json mongodb playframework geojson reactivemongo

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

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

非常感谢您的任何建议!

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

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

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

对不起,这显然是做什么的。在案例类模型中,只需定义一个具有不同名称的方法(来自&#34;类型&#34;在此示例中,但基本上任何关键字都会导致问题:

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

然后在模板中调用它:

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

全部谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用backticks将字段type包装成如下:

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

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

答案 1 :(得分:0)

只需将代码包装在花括号中,就像这样:

@{ngh.geometry.`type`}

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

您的完整工作代码将是:

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