uniXVanXcel
uniXVanXcel

Reputation: 806

getting the value of a key in a map in Scala

I am new to scala and still needs to learn a lot. but for the time being I have this json object :

driverCarJSON = """{
    "collection": {
        "listing": [ 
        ],
        "cars": ["bmw", "ford", "vw"]
        ,
        "carDriverMap" :[{"car1":"driver1"},
        {"car2":"driver2"},
        {"car3":"driver3"},
        {"car4":"driver4"},
        {"car5":"driver5"}]
    }
}"""

I am trying to access the value of the keys in carDriverMap. So if I want the value of "car2" it should return "driver2"

Now, I am parsing this json using this:

scala.util.parsing.json.JSON.parseFull(driverCarJSON)

This returns

Some(Map(collection -> Map(listing -> List(), cars -> List(bmw, ford, vw), carDriverMap -> List(Map(car1 -> driver1), Map(car2 -> driver2), Map(car3 -> driver3), Map(car4 -> driver4), Map(car5 -> driver5)))))

I am stuck here what should i do?

I have seen this solution using a function

def getValue(parsedJson : Option[Any] , key:String): String ={
  parsedJson match {
    case Some(m : Map[String,Any]) => m(key) match {
      case d:String => d
    }
  }
}

and then calling it getValue(driverCarJSON , carDriverMap["collection"][2]["car2"]) but when i print it nothing gets printed.

Thanks

Upvotes: 0

Views: 4013

Answers (1)

Andrey Tyukin
Andrey Tyukin

Reputation: 44918

Update 2024

If you don't care about what used to work for 2.11, consider using e.g.


Original answer from 2018

This here works with 2.11 and separate parser-combinators dependency:

val driverCarJSON = """{
    "collection": {
        "listing": [ 
        ],
        "cars": ["bmw", "ford", "vw"]
        ,
        "carDriverMap" :[{"car1":"driver1"},
        {"car2":"driver2"},
        {"car3":"driver3"},
        {"car4":"driver4"},
        {"car5":"driver5"}]
    }
}"""

val parsedJson = scala.util.parsing.json.JSON.parseFull(driverCarJSON).get
val d2 = parsedJson
  .asInstanceOf[Map[String, Any]]
  .apply("collection")
  .asInstanceOf[Map[String, Any]]
  .apply("carDriverMap")
  .asInstanceOf[List[Map[String, String]]]
  .apply(1)("car2")
  
println(d2) // output: driver2

But I personally find the API not terribly well thought out. I couldn't find any way to avoid all the ugly and unnecessary asInstanceOfs. This has been deprecated very long ago, so please consider using something newer like json4s, it does not suffer from the repetitive asInstanceOfs.

Upvotes: 2

Related Questions