json4s无法使用mixin trait序列化case类

时间:2014-10-03 12:38:27

标签: json scala mixins traits json4s

为什么这不起作用?

object JsonExample extends App {
  import org.json4s._
  import org.json4s.native.Serialization
  import org.json4s.native.Serialization.{read, write}
  implicit val formats = Serialization.formats(NoTypeHints)

  case class Winner(id: Long, numbers: List[Int])    

  trait Greet { val greeting = "hi"}
  val obj = new Winner(1, List(1,2)) with Greet
  println(write(obj))
}

这会打印一个空的JSON对象

{}

然而,如果我用Greet"删除"我得到了(正确的)结果:

{"id":1,"numbers":[1,2]}

2 个答案:

答案 0 :(得分:4)

如果您对格式更具体,您可以获得结果:

import org.json4s.{FieldSerializer, DefaultFormats}
import org.json4s.native.Serialization.write

case class Winner(id: Long, numbers: List[Int])
trait Greet { val greeting = "hi"}

implicit val formats = DefaultFormats + FieldSerializer[Winner with Greet]()

val obj = new Winner(1, List(1,2)) with Greet

//returns {"greeting":"hi","id":1,"numbers":[1,2]}
write(obj)

答案 1 :(得分:1)

我猜它使用Greet类型而不是Winner。但是,我不知道如何解决它(除非有自定义格式)。否则你可以尝试Genson,它适用于你的例子,并且不需要大量的进口:

import com.owlike.genson.defaultGenson_

// produces {"id":1,"numbers":[1,2]}
val jsonString = toJson(winnerObject)

它还支持json4s类型,所以如果你想要一个类似DOM的表示并从那里使用json4s,你可以继续使用任何JValue子类。