maloney
maloney

Reputation: 1663

Play ScalaJSON Reads[T] parsing type mismatch error

I have a big chunk of Json, of which I only care about a small subset e.g:

{
  "request": {
    "c": {
      "code": "AA",
      "fsCode": "AA"
    },
    "codeType": {},
    "number": {
      "requested": "100",
     },
  "scheduled": [
    {
      "code": "BB",
      "number": "100",
      "classes": [
        "F",
        "Y"
      ]
   }]
}

I just want to extract the code and number variables. I have tried using Reads as follows:

case class TheResult(result: (String, String))

implicit val theScheduledReads: Reads[TheResult] = (
    (__ \ "code").read[String] and
      (__ \ "number").read[String] tupled) map TheScheduledFlight.apply _

case class ResultList(addr: List[TheResult])

implicit val resultReads: Reads[ResultList] =
  (__ \ "scheduled").read(List[TheResult](theScheduledReads)) map ResultList _

and then this to access the result:

response.json.validate[List[ResultList]]

However, it throws this error:

type mismatch; found : play.api.libs.json.Reads[details.client.TheResult] required: details.client. TheResult (__ \ "address").read(List[TheResult](resultReads)) map (TheResult.apply _)

Any ideas what I'm doing wrong?

Upvotes: 1

Views: 67

Answers (1)

Nagarjuna Pamu
Nagarjuna Pamu

Reputation: 14825

Fixed multiple problems in the code. Have a look

Most importantly read(List[TheResult](theScheduledReads)) makes no sense. It should be read[List[TheResult]]

Replace TheScheduledFlight.apply with TheResult.apply _

case class TheResult(result: (String, String))

implicit val theScheduledReads: Reads[TheResult] = (
  (__ \ "code").read[String] and
    (__ \ "number").read[String] tupled) map TheResult.apply _ //problem fixed here

case class ResultList(addr: List[TheResult])

implicit val resultReads: Reads[ResultList] =
  (__ \ "scheduled").read[List[TheResult]] map ResultList.apply _ //problem fixed here

Upvotes: 1

Related Questions