Skip to main content

kebs-spray-json

Automatic JsonFormat derivation for spray-json.

Setup

libraryDependencies += "pl.iterators" %% "kebs-spray-json" % kebsVersion

Basic usage

Mix in KebsSprayJson to get automatic format derivation:

import pl.iterators.kebs.sprayjson.KebsSprayJson
import spray.json.DefaultJsonProtocol

object ThingProtocol extends DefaultJsonProtocol with KebsSprayJson

Or use the package object directly (it extends DefaultJsonProtocol + KebsSprayJson):

import pl.iterators.kebs.sprayjson._

This gives you:

  • Flat format for 1-element case classes (case class ThingId(uuid: UUID) serializes as just the UUID, not {"uuid": "..."})
  • Automatic format for multi-field case classes (no need to call jsonFormatN)
  • Case object format (serializes as {})
  • Parametrized (generic) case classes
  • Support for case classes with > 22 fields

Snakified / capitalized field names

import pl.iterators.kebs.sprayjson.KebsSprayJsonSnakified

object ThingProtocol extends DefaultJsonProtocol with KebsSprayJsonSnakified

// or via package object:
import pl.iterators.kebs.sprayjson.snakified._

Capitalized variant:

import pl.iterators.kebs.sprayjson.KebsSprayJsonCapitalized
// or: import pl.iterators.kebs.sprayjson.capitalized._

Snakified/capitalized names are computed at compile time.

NullOptions support

Mix in spray-json's NullOptions to serialize None as null instead of omitting the field:

object ThingProtocol extends DefaultJsonProtocol with KebsSprayJson with NullOptions

Enum support

import pl.iterators.kebs.sprayjson.{KebsSprayJson, KebsSprayJsonEnums, KebsSprayJsonValueEnums}

object ThingProtocol extends DefaultJsonProtocol
with KebsSprayJson with KebsSprayJsonEnums with KebsSprayJsonValueEnums

For uppercase/lowercase enum serialization:

import pl.iterators.kebs.sprayjson.enums.{KebsSprayJsonEnumsUppercase, KebsSprayJsonEnumsLowercase}

object ThingProtocol extends DefaultJsonProtocol
with KebsSprayJson with KebsSprayJsonEnumsUppercase with KebsSprayJsonValueEnums

Or via the enums package object:

import pl.iterators.kebs.sprayjson.enums._            // default casing
import pl.iterators.kebs.sprayjson.enums.uppercase._ // UPPERCASE
import pl.iterators.kebs.sprayjson.enums.lowercase._ // lowercase

Instance support (java.time, UUID, etc.)

Mix in kebs-instances traits to get automatic JsonFormat for common types:

import pl.iterators.kebs.instances.TimeInstances
import pl.iterators.kebs.instances.UtilInstances
import pl.iterators.kebs.instances.net.URIString

object ThingProtocol extends DefaultJsonProtocol
with KebsSprayJson with TimeInstances with UtilInstances with URIString

This covers Instant, LocalDate, ZonedDateTime, Duration, UUID, Currency, Locale, URI, and more.

For alternative encodings (e.g. Instant as epoch millis instead of ISO string), see the instances documentation.

Recursive formats

case class Thing(thingId: String, parent: Option[Thing])
implicit val thingFormat: RootJsonFormat[Thing] = jsonFormatRec[Thing]

Overriding flat format

If you want a 1-field case class serialized as an object (not flat), redefine the implicit:

case class Chapter(name: String)
implicit val chapterRootFormat: RootJsonFormat[Chapter] = jsonFormatN[Chapter]