Search code examples
jsonplayframework

Play JSON Parse and Extract Elements Without a Key Path


I have a JSON that looks like this, yes the JSON is a valid format.

[2,
 "19223201",
 "BootNotification",
 {
 "reason": "PowerUp",
   "chargingStation": {
     "model": "SingleSocketCharger",
     "vendorName": "VendorX"
   }
 }
]

I'm using Play framework's JSON library and I would like to understand how I could parse the 3rd line and extract the BootNotification value as a String.

If it had a key, I can use that key to traverse the JSON and get the corresponding value, but this is not the case here. I also do not have the possibility to load this line by line and infer from line number 3 as with the example above.

Any suggestions on how I could do this?


Solution

  • I think, I have found out a way after trying all this on Ammonite. Here is what I could do:

    @ val input: JsValue = Json.parse("""[2,"12345678","BNR",{"reason":"PowerUp"}]""") 
    input: JsValue = JsArray(ArrayBuffer(JsNumber(2), JsString("12345678"), JsString("BNR"), JsObject(Map("reason" -> JsString("PowerUp")))))
    

    Parsing the JSON, I get a nice array and I know that I always expect just 4 elements in the Array, so explicitly looking for an element with the array index is what I need. So to get the text at position 3, I could do the following:

    @ (input \ 2) 
    res2: JsLookupResult = JsDefined(JsString("BNR"))
    
    @ (input \ 2).toOption 
    res3: Option[JsValue] = Some(JsString("BNR"))
    
    @ (input \ 2).toOption.isDefined 
    res4: Boolean = true