While exploring a new JSON API, I like to get quick feedback on how the API response information is organized and how to work with the data. Useful tools for this task in a Scala context are json4s and scalaj-http
Here’s a quick way to set up an Ammonite-REPL session with those dependencies for supercharged JSON sandboxing.
–
Prerequisite: install the wonderful amm REPL
Enter a REPL session by typing amm
from the terminal. You can enter the following commands one by one, or just copy-and-paste the whole blob to load up all the dependencies and get moving quickly.
// Welcome to the Ammonite Repl 1.0.0
// (Scala 2.12.2 Java 1.8.0_152)\
// NOTE THAT SCALA VERSION in the inital output
// Use the scala version in the import statements:
import $ivy. `org.json4s:json4s-ext_2.12:3.5.0`
import $ivy. `org.json4s:json4s-jackson_2.12:3.5.0`
import $ivy. `org.json4s:json4s-native_2.12:3.5.0`
import $ivy. `org.scalaj:scalaj-http_2.12:2.3.0`
import org.json4s._
import org.json4s.native.JsonMethods._
import org.json4s.JsonDSL._
import scalaj.http.Http
implicit val formats = org . json4s . DefaultFormats
// grab some sample JSON
val response = Http ( "https://jsonplaceholder.typicode.com/posts/1" ). asString
val parsedResponse = parse ( response . body )
val articleTitle = ( parsedResponse \\ "title" ). extract [ String ]
case class Post ( userId : Int , id : Int , title : String , body : String )
val post = parsedResponse . extract [ Post ]
Add some Avro to the mix:
import $ivy. `org.apache.avro:avro:1.8.2`
import org.apache.avro.generic.GenericData
import org.apache.avro.Schema.Parser
val schemaParser = new Parser
val schemaJson =
s """
{
"namespace": "com.avro.junkie",
"type": "record",
"name": "User2",
"fields": [
{"name": "name", "type": "string"},
{"name": "favoriteNumber", "type": "int"},
{"name": "favoriteColor", "type": "string"}
]
}
"""
val avroSchema = schemaParser . parse ( schemaJson )
val avroRecord = new GenericData . Record ( avroSchema )
avroRecord . put ( "name" , "mary" )
avroRecord . put ( "favoriteNumber" , 11 )
avroRecord . put ( "favoriteColor" , "green" )
avroRecord . toString
// bring it all together - go from Avro to JSON AST
parse ( avroRecord . toString )