JsonProperty注释不适用于Scala中的Json解析(Jackson / Jerkson)

时间:2014-04-17 16:58:06

标签: json scala jackson jerkson

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

  

{“type”: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].

P.S:如上所示,我使用的是jerkson / jackson,但如果能让生活更轻松的话,请不要介意切换到其他json解析库。

3 个答案:

答案 0 :(得分:3)

使用反引号来阻止Scala编译器将类型解释为关键字:

case class MyJsonObj(
    val `type`: Int
)

答案 1 :(得分:1)

我怀疑你没有正确地在杰克逊中启用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

请注意,我已通过调用registerModule

向对象映射器添加了Scala支持

答案 2 :(得分:0)

正如@wingedsubmariner所暗示的那样,答案在于Scala meta annotations

这对我有用:

import scala.annotation.meta.field

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

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