1

我需要解析以下 json 字符串:

{“类型”:1}

我正在使用的案例类如下所示:

case class MyJsonObj(
    val type: Int
)

然而,这让 Scala 感到困惑,因为 'type' 是一个关键字。因此,我尝试使用来自 Jacson/Jerkson 的 @JsonProperty 注释,如下所示:

case class MyJsonObj(
    @JsonProperty("type") val myType: Int
)

但是,Json 解析器仍然拒绝在 json 中查找 'type' 字符串而不是 'myType'。以下示例代码说明了问题:

import com.codahale.jerkson.Json._
import org.codehaus.jackson.annotate._

case class MyJsonObj(
    @JsonProperty("type") val myType: Int
)

object SimpleExample {
  def main(args: Array[String]) {
    val jsonLine = """{"type":1}"""
    val JsonObj = parse[MyJsonObj](jsonLine)
}

我收到以下错误:

[error] (run-main-a) com.codahale.jerkson.ParsingException: Invalid JSON. Needed [myType], but found [type].

PS:如上所示,我正在使用 jerkson/jackson,但如果这样可以让生活更轻松,我不介意切换到其他一些 json 解析库。

4

3 回答 3

4

使用反引号防止 Scala 编译器将 type 解释为关键字:

case class MyJsonObj(
    val `type`: Int
)
于 2014-04-17T17:12:43.220 回答
3

我怀疑您没有在 Jackson 中正确启用 Scala 支持。

我试过这个:

object Test extends App {

  val mapper = new ObjectMapper
  mapper.registerModule(DefaultScalaModule)
  println(mapper.writeValueAsString(MyJsonObj(1)))

  val obj = mapper.readValue("""{"type":1}""", classOf[MyJsonObj])
  println(obj.myType)
}

case class MyJsonObj(@JsonProperty("type") myType: Int)

我得到:

{"type":1}
1

请注意,我通过调用向对象映射器添加了 Scala 支持registerModule

于 2014-04-17T18:35:28.793 回答
3

正如@wingedsubmariner 暗示的那样,答案在于Scala 元注释

这对我有用:

import scala.annotation.meta.field

case class MyJsonObj(
    @(JsonProperty @field)("type") val myType: Int
)

这是对 的补充mapper.registerModule(DefaultScalaModule),如果您要反序列化为 Scala 类,您可能需要它。

于 2019-09-06T02:28:24.390 回答