当字段是 Scala 关键字时,如何自动将 JSON 映射到案例 class?
How can I automatically map JSON to a case class when a field is a scala keyword?
在 Play Framework (2.6) 中;我目前是 automatically mapping JSON to case classes from MongoDB (using ReactiveMongo 0.12 with JSON Collections). I have downloaded a dataset (here) and imported it into MongoDB as a collection in order to do some testing relating to geospatial queries. However one of the fields is called "type" (at a quick glance you will see this here),所以我遇到了问题,因为这是 Scala 中的关键字。否则我会这样写:
case class Geometry(coordinates: List, type: String)
case class Neighborhood(_id: Option[BSONObjectID], geometry: Geometry, name: String)
非常感谢您在这里提出任何建议!
补充一下(感谢@MarioGalic);将 scala 关键字 声明为 class 参数名称似乎是用反引号完成的,但我在 Play 模板 中输出它们时仍然遇到问题.因此,如果我遍历每个文档,我可能会写这个(出现错误)。
@for(ngh <- neighborhoods){
<tr>
...
<td>@ngh.name</td>
<td>@ngh.geometry.`type`</td>
...
</tr>
}
没有反引号在这里不起作用,模板 无法识别反引号。我在 this referenced question/answer on the subject 中找不到任何其他格式,所以我仍然遇到问题。谢谢
抱歉,很明显该怎么做。在 case class model 中,只需定义一个具有不同名称的方法(在此示例中来自 "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>
}
谢谢大家!
您可以像这样用 backticks 包裹字段 type
:
case class Geometry(coordinates: List, `type`: String)
以下答案更详细地解释了反引号语法:
Need clarification on Scala literal identifiers (backticks)
只需将您的代码包裹在 花括号 中,如下所示:
@{ngh.geometry.`type`}
和 type
字段将在 Play 模板中正确呈现。无需创建 getType
方法。
您的完整工作代码为:
@for(ngh <- neighborhoods){
<tr>
...
<td>@ngh.name</td>
<td>@{ngh.geometry.`type`}</td>
...
</tr>
}
在 Play Framework (2.6) 中;我目前是 automatically mapping JSON to case classes from MongoDB (using ReactiveMongo 0.12 with JSON Collections). I have downloaded a dataset (here) and imported it into MongoDB as a collection in order to do some testing relating to geospatial queries. However one of the fields is called "type" (at a quick glance you will see this here),所以我遇到了问题,因为这是 Scala 中的关键字。否则我会这样写:
case class Geometry(coordinates: List, type: String)
case class Neighborhood(_id: Option[BSONObjectID], geometry: Geometry, name: String)
非常感谢您在这里提出任何建议!
补充一下(感谢@MarioGalic);将 scala 关键字 声明为 class 参数名称似乎是用反引号完成的,但我在 Play 模板 中输出它们时仍然遇到问题.因此,如果我遍历每个文档,我可能会写这个(出现错误)。
@for(ngh <- neighborhoods){
<tr>
...
<td>@ngh.name</td>
<td>@ngh.geometry.`type`</td>
...
</tr>
}
没有反引号在这里不起作用,模板 无法识别反引号。我在 this referenced question/answer on the subject 中找不到任何其他格式,所以我仍然遇到问题。谢谢
抱歉,很明显该怎么做。在 case class model 中,只需定义一个具有不同名称的方法(在此示例中来自 "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>
}
谢谢大家!
您可以像这样用 backticks 包裹字段 type
:
case class Geometry(coordinates: List, `type`: String)
以下答案更详细地解释了反引号语法: Need clarification on Scala literal identifiers (backticks)
只需将您的代码包裹在 花括号 中,如下所示:
@{ngh.geometry.`type`}
和 type
字段将在 Play 模板中正确呈现。无需创建 getType
方法。
您的完整工作代码为:
@for(ngh <- neighborhoods){
<tr>
...
<td>@ngh.name</td>
<td>@{ngh.geometry.`type`}</td>
...
</tr>
}