在Scala(Play Framework)中将对象序列化为JSON基元类型
请查看以下示例:在Scala(Play Framework)中将对象序列化为JSON基元类型,scala,play-json,Scala,Play Json,请查看以下示例: object MyTrait { def apply(value: Int): MyTrait = value match { case 0 => A case 1 => B case 2 => C case _ => C } def unapply(arg: MyTrait): Int = arg.value } case object A extends MyTrait { val value =
object MyTrait {
def apply(value: Int): MyTrait = value match {
case 0 => A
case 1 => B
case 2 => C
case _ => C
}
def unapply(arg: MyTrait): Int = arg.value
}
case object A extends MyTrait {
val value = 0
}
case object B extends MyTrait {
val value = 1
}
case object C extends MyTrait {
val value = 2
}
case class Test(value: MyTrait)
implicit val testFormatter = Json.format[Test]
好吧,这段代码不会工作,因为我没有为我的类型“MyTrait”创建JSON序列化程序。我可以按照Play框架在文档中向我们展示的方式来做,但它会使json看起来像
{ value: { whatever: 1 } }
我希望它看起来像
{ value: 1 }
简而言之,我希望我的MyTrait对象被解释为基本类型(Int),而不是嵌套的Json项目
如果有人能帮我,我会非常感激的。
提前谢谢你 指示如何提供自定义写入
,在MyTrait
中只序列化它的内部值
sealed trait MyTrait{
定义值:Int
}
case对象A扩展了MyTrait{
val值=0
}
case对象B扩展了MyTrait{
val值=1
}
case对象C扩展了MyTrait{
val值=2
}
对象MyTrait{
导入play.api.libs.json_
def apply(值:Int):MyTrait=值匹配{
案例0=>A
案例1=>B
案例2=>C
案例uz=>C
}
def unapply(arg:MyTrait):Int=arg.value
//---五
隐式val写入:写入[MyTrait]=
写入[MyTrait]{v=>JsNumber(v.value)}
}
然后,当序列化MyTrait
实例时(请注意,由于Writes
是不变的,所以需要下面的类型归属):
Json.toJson(A:MyTrait)
//-->res2:play.api.libs.json.JsValue=0
关于测试
课程:
案例类测试(值:MyTrait)
对象测试{
导入play.api.libs.json_
隐式val writes:OWrites[Test]=Json.writes[Test]
}
toJson(测试(A))
//-->res1:play.api.libs.json.JsValue={“value”:0}
我建议您查看枚举类型
MyTrait
,或者将MyTrait
重构为一个类,并使用Json.valueFormat
,如下所示
import play.api.libs.json_
最后一个类MyTrait private(val值:Int)扩展了AnyVal
对象MyTrait{
val A=新的MyTrait(0)
val B=新的MyTrait(1)
val C=新的MyTrait(2)
隐式val格式:format[MyTrait]=Json.valueFormat[MyTrait]
}
案例类测试(值:MyTrait)
对象测试{
隐式val格式:OFormat[Test]=Json.format
}
scala>Json.toJson(测试(MyTrait.A))
res0:play.api.libs.json.JsValue={“value”:0}
你没有为问题中的MyTrait
提供格式
或编写
(因为它无法编译),trait本身也没有。嗨,既然我看到了答案,它看起来如此明显,我为什么不考虑这个问题呢。无论如何,非常感谢你给出了非常清晰的答案!