我需要解析以下json字符串:
{“类型”:1}
我使用的case类如下所示:
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解析库。
发布于 2014-04-17 17:12:43
使用反引号防止Scala编译器将类型解释为关键字:
case class MyJsonObj(
val `type`: Int
)发布于 2014-04-17 18:35:28
我怀疑您没有在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请注意,我通过调用registerModule向对象映射程序添加了Scala支持
发布于 2019-09-06 02:28:24
正如“翼潜水手”所暗示的那样,答案在于Scala元注释。
这对我起了作用:
import scala.annotation.meta.field
case class MyJsonObj(
@(JsonProperty @field)("type") val myType: Int
)这是对mapper.registerModule(DefaultScalaModule)的补充,如果要反序列化为Scala类,您可能需要它。
https://stackoverflow.com/questions/23139127
复制相似问题