faster2b
faster2b

Reputation: 672

Play ScalaJSON Reads[T] parsing

I am writing an Json parse for an rest webservice response, I have an Json file looking as:

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

I wrote an case class for the Reads object:

case class program(name:String)

implicit val programFormat = Json.format[program]

And this pseudo code for get a data:

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

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

For the field name no problem, the code work well, but I don't understand how capture the field "@id" and the field "$" because I cannot create an param in case class named: @id or $.

Thank you for your help.

Upvotes: 1

Views: 93

Answers (1)

Infinity
Infinity

Reputation: 3441

More correct solution in my opinion is creating own Reads, that is:

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

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

Another solution, i think much worse one, is using backtick sign

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

It allows to write special signs in method names, field names and so on. More about it: Need clarification on Scala literal identifiers (backticks)

Upvotes: 4

Related Questions