Вы можете легко создать свой собственный сериализатор. Подписывайтесь на меня.
Прежде всего, сделайте небольшое изменение в formats
:
implicit val formats = DefaultFormats + new BookSerializer
После этого создайте свой собственный сериализатор/десериализатор:
class BookSerializer extends CustomSerializer[Book](format => (
{
case JObject(JField("title", JString(t)) :: JField("author", JString(a)) ::Nil) =>
new Book(t, a)
},
{
case x @ Book(t: String, a: String) =>
JObject(JField("title", JString(t)) ::
JField("author", JString(a)) :: Nil)
case Book(null, a: String) =>
JObject(JField("author", JString(a)) :: Nil) // `title` == null
}
))
Первая часть — это десериализатор (преобразование данных из json в класс case), а вторая — сериализатор (преобразование из класса case в json). Я добавил случай title == null
. Вы можете легко добавить столько дел, сколько вам нужно.
Весь список:
import org.json4s.jackson.JsonMethods._
import org.json4s.{DefaultFormats, Extraction}
import org.json4s._
case class Book(title: String, author: String)
implicit val formats = DefaultFormats + new BookSerializer
class BookSerializer extends CustomSerializer[Book](format => (
{
case JObject(JField("title", JString(t)) :: JField("author", JString(a)) ::Nil) =>
new Book(t, a)
},
{
case x @ Book(t: String, a: String) =>
JObject(JField("title", JString(t)) ::
JField("author", JString(a)) :: Nil)
case Book(null, a: String) =>
JObject(JField("author", JString(a)) :: Nil) // `title` == null
}
))
val bookJValue = Extraction.decompose(Book(null, "Arthur C. Clark"))
val compacted = compact(render(bookJValue))
Выход:
compacted: String = {"author":"Arthur C. Clark"}
Дополнительную информацию можно найти на странице проекта json4s.
person
ilyakhov
schedule
23.10.2015