播放ScalaJSON读取[T]解析

时间:2015-05-06 10:33:43

标签: json scala playframework

我正在为休息webservice响应编写一个Json解析器,我有一个Json文件看起来像:

{"program": {
                "name": "myname",
                "@id": "12345",
                "$": "text text text"
            }, etc. etc.

我为Reads对象编写了一个case类:

case class program(name:String)

implicit val programFormat = Json.format[program]

这个用于获取数据的伪代码:

val x=(jobj \ "program").validate[program]

x match {
    case JsSuccess(pr, _) => println("JsSuccess:"+pr)
        for(p<- pr.program)
        {
            println(p.name)
        }
    case error: JsError => ....
}

对于字段名称没有问题,代码运行良好,但我不明白如何捕获字段&#34; @ id&#34;和#34; $&#34;因为我无法在名为:@id或$。

的案例类中创建一个参数

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我认为更正确的解决方案是创建自己的Reads,即:

case class Program(name: String, id: String, dollar: String)
implicit val programWrites: Reads[Program] = (
      (__ \ "name").read[String] ~
      (__ \ "@id").read[String] ~
      (__ \ "$").read[String]
)(Program.apply _)

文档:https://www.playframework.com/documentation/2.4.x/ScalaJsonCombinators#Reads

另一个解决方案,我认为更糟糕的是,使用反引号

case class Program(name: String, `@id`: String, `$`: String)
implicit val programFormat = Json.format[Program]

它允许在方法名称,字段名称等中写入特殊符号。 更多相关信息:Need clarification on Scala literal identifiers (backticks)