2

为什么这不起作用?

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 对象

{}

而如果我删除“with Greet”,我会得到(正确的)结果:

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

2 回答 2

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)
于 2014-10-03T14:33:34.760 回答
1

我猜它使用 Greet 类型而不是 Winner。但是我不知道你怎么能解决它(可能除了自定义格式)。否则,您可以尝试Genson,它可以很好地与您的示例配合使用,并且不需要大量导入:

import com.owlike.genson.defaultGenson_

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

它还支持 json4s 类型,因此如果您想要类似 DOM 的表示形式并从那里使用 json4s,您仍然可以使用任何 JValue 子类。

于 2014-10-03T13:36:29.123 回答