/json2s

Generate scala case classes from an example json object.

Primary LanguageScalaOtherNOASSERTION

json2s

Generate scala case classes from an example json object or an array of several example objects. Extensions may possibly include xml or similar other input types.

The root of the project contains a play web app to demo the functionality but the actual implementation can be found in the "core" module (it is pretty small).

The app can be viewed at https://json2s.herokuapp.com/

Motivation

Many scala Json libraries allow for json => case class conversion like so:

scala> import org.json4s._
scala> import org.json4s.native.JsonParser.parse
scala> implicit val formats = DefaultFormats // Brings in default date formats etc.
scala> case class Child(name: String, age: Int, birthdate: Option[java.util.Date])
scala> case class Address(street: String, city: String)
scala> case class Person(name: String, address: Address, children: List[Child])
scala> val json = parse("""
         { "name": "joe",
           "address": {
             "street": "Bulevard",
             "city": "Helsinki"
           },
           "children": [
             {
               "name": "Mary",
               "age": 5,
               "birthdate": "2004-09-04T18:06:22Z"
             },
             {
               "name": "Mazy",
               "age": 3
             }
           ]
         }
       """)

scala> json.extract[Person]
res0: Person = Person(joe,Address(Bulevard,Helsinki),List(Child(Mary,5,Some(Sat Sep 04 18:06:22 EEST 2004)), Child(Mazy,3,None)))

(taken from http://json4s.org/#extracting-values)

This makes for seamless access of json data through scala code. This is a huge step up from manually mapping json objects to classes, but there is still some tedious work to be done. Namely, creating the case classes to correspond to the json objects (in the above example, Child, Address, and Person). This can get quite difficult if you need to handle a large json object (ie from an API response), since if even one field or type is wrong, the extract will fail.

This project will attempt to automatically create the case classes for you so that, in combination with extract, any json API that provides example output can be quickly wrapped in awesome scala code.

Example basic functionality

scala> import lt.tabo.json2s.JsonToScala
scala> JsonToScala("""
          { "name": "joe",
            "address": {
              "street": "Bulevard",
              "city": "Helsinki"
            },
            "children": [
              {
                "name": "Mary",
                "age": 5,
                "birthdate": "2004-09-04T18:06:22Z"
              },
              {
                "name": "Mazy",
                "age": 3
              }
            ]
          }
        """, "Person")
res0: String =
case class Address(street: String, city: String)
case class Child(age: Int, name: String, birthdate: Option[java.util.Date])
case class Person(name: String, address: Address, children: List[Child])

Features

  • handles java.util.Date, more to come possibly?
  • convert array names to singular class names (eg children: List[Child])
  • handle names with invalid scala characters by putting them in backticks

TODO

  • add documentation, tests