Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala(Play Framework)中将对象序列化为JSON基元类型_Scala_Play Json - Fatal编程技术网

在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本身也没有。嗨,既然我看到了答案,它看起来如此明显,我为什么不考虑这个问题呢。无论如何,非常感谢你给出了非常清晰的答案!