我需要解析以下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解析库。
答案 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
答案 2 :(得分:0)
正如@wingedsubmariner所暗示的那样,答案在于Scala meta annotations。
这对我有用:
import scala.annotation.meta.field
case class MyJsonObj(
@(JsonProperty @field)("type") val myType: Int
)
这是mapper.registerModule(DefaultScalaModule)
的补充,如果要反序列化为Scala类,则可能需要使用它。