繁体   English   中英

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

[英]How can I automatically map JSON to a case class when a field is a scala keyword?

Play 框架 (2.6) 内 我目前正在自动将JSON 映射到来自 MongoDB 的案例类(使用ReactiveMongo 0.12JSON Collections )。 我已经下载了一个数据集( 这里)并将它作为一个集合导入到MongoDB中,以便进行一些与地理空间查询相关的测试。 然而,其中一个字段称为“类型”(快速浏览您会在此处看到),因此我遇到了问题,因为这是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>
   }

没有反引号在这里不起作用,并且模板中无法识别反引号。 在该主题的参考问题/答案中找不到任何其他格式,因此我仍然遇到问题。 谢谢


抱歉,这很明显要做什么。 案例类模型中,只需定义一个具有不同名称的方法(与本示例中的“type”不同,但本质上是任何导致问题的关键字

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

然后在模板中调用它:

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

谢谢大家!

您可以像这样用反引号包裹字段type

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

以下答案更详细地解释了反引号语法: 需要澄清 Scala 文字标识符(反引号)

只需将您的代码用花括号括起来,如下所示:

@{ngh.geometry.`type`}

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

您的完整工作代码将是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM