j3d
j3d

Reputation: 9724

Play Framework & JSON: How to get an item of an array by value

Given the following JSON...

{
  "firstName": "Joe",
  "lastName": "Grey",
  ...
  "addresses":
  [
    {
      "name": "Default",
      "street": "...",
      ...,
      "isDefault": true
    },
    {
      "name": "Home",
      "street": "...",
      ...,
      "isDefault": false
    },
    {
      "name": "Office",
      "street": "...",
      ...,
      "isDefault": false
    }
  ]
}

... how do I get let's say the item with name equal to Home?

    {
      "name": "Home",
      "street": "...",
      ...,
      "isDefault": false
    }

Thanks.

Upvotes: 2

Views: 854

Answers (1)

j3d
j3d

Reputation: 9724

The links suggested by user1502304 does not provide any info on this topic. Furthermore, according to this discussion the current JSON library has some limitations... and as mentioned here the good alternative is JsZipper. That said, here below is how to get an item by value:

scala> import play.api.libs.json._
import play.api.libs.json._

scala> import play.api.libs.json.extensions._
import play.api.libs.json.extensions._

scala> val user = Json.parse("""
     | {
     |   "firstName": "Joe",
     |   "lastName": "Grey",
     |   "isDefault": false,
     |   "addresses":
     |   [
     |     {
     |       "name": "Default",
     |       "street": "one",
     |       "isDefault": true
     |     },
     |     {
     |       "name": "Home",
     |       "street": "two",
     |       "isDefault": false
     |     },
     |     {
     |       "name": "Office",
     |       "street": "three",
     |       "isDefault": false
     |     }
     |   ]
     | }""")
json: play.api.libs.json.JsValue = {"firstName":"Joe","lastName":"Grey","isDefault":false,"addresses":[{"name":"Default","street":"one","isDefault":true},{"name":"Home","street":"two","isDefault":false},{"name":"Office","street":"three","isDefault":false}]}

scala> JsZipper(json).findByValue(_ \ "name" == JsString("Default")).value
res8: play.api.libs.json.JsValue = {"name":"Default","street":"one","isDefault":true}

I hope it helps.

Upvotes: 1

Related Questions