Question

I'm trying to extract the data from a JSON file that looks like that :

    val json: JsValue = Json.parse("""
    { 
      "item": {
            "id" : "11111111",
            "name" : "box",
            "categories" : [{
                               "name" : "blue box",
                               "id" : "12345",
                           },
                           {
                               "name" : "fancy box",
                               "id" : "98765",
                           }]
              } 
    }
    """)

I would like to do it using the play JSON library. I came up with this code :

    //I define my class and reader for one category
    case class ItemCategory(id: Option[String], name: String)
    implicit val categoryRead: Reads[ItemCategory] = (
        (JsPath \ "item" \ "categories" \ "id").readNullable[String] and
        (JsPath \ "item" \ "categories" \ "name").read[String]
    )(ItemCategory.apply _)

    //I define my class and reader for one item
    case class MyItem(categories : Option[List[ItemCategory]], id : Option[String], name : Option[String])
    implicit val myItemRead: Reads[MyItem] = (
        (JsPath \ "item" \ "categories").readNullable[List[ItemCategory]] and
        (JsPath \ "item" \ "id").readNullable[String] and
        (JsPath \ "item" \ "name").readNullable[String]
    )(MyItem.apply _)

    //I then try to read : 
    var item: JsResult[MyItem] = json.validate[MyItem](myItemRead)
    println(item)

However this code gives a JsError :List(ValidationError(validate.error.missing-path,WrappedArray())).

Which to my understanding simply means that some path went missing. I tried to read just one category and it worked fine, I try to read an item without trying to get the categories and here again it went fine. Hence I think the problem is on reading a list of items. I would really appreciate if you could help me with this.

Était-ce utile?

La solution

Path is relative. categoryRead js path should be relative. Such as _ \ xxx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top