2014-10-03 83 views
2

为什么这不起作用?json4s无法用mixin特征序列化案例类

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

{} 

而如果我删除了 “以迎接” 我获得(正确)结果:

{"id":1,"numbers":[1,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) 
1

我想它使用问候键入而不是赢家。但是我不知道你能如何解决它(除了可能是自定义格式)。否则,你可以尝试Genson,它很好地与你的榜样,并且不需要万吨进口:

import com.owlike.genson.defaultGenson_ 

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

它还支持json4s类型,所以如果你想有一个DOM可以例如仍然DESER任何JValue子像表示和从那里使用json4s。