【问题标题】:Json parsing with scala/play: how to get a trait?使用 scala/play 解析 Json:如何获得特征?
【发布时间】:2018-05-29 21:17:30
【问题描述】:

当我尝试使用 play2 在 Scala 中读取 Json 时,我被卡住了,使用这些信息来创建一个对象。 这是我现在的代码:

  trait MyTrait {
  }

  object object1 extends MyTrait {
    override def toString: String = "object1"
  }

  object object2 extends MyTrait{
    override def toString: String = "object2"
  }

  def strToObject(str: String): MyTrait = str match {
    case "object1" => object1
    case "object2" => object2
  }

这就是我写 Json 的方式:

 implicit val traitWrites = new Writes[MyTrait] {
    def writes(t: MyTrait) = Json.obj(
      "t" -> t.toString)
  }

输出

println("object1: " + Json.toJson(object1).toString)
println("object2: " + Json.toJson(object1).toString)

object1: {"t":"object1"}
object2: {"t":"object1"}

这就是我尝试阅读的方式,但它不起作用。

 implicit val traitReads: Reads[MyTrait] = (
    (JsPath \ " t" ).read[String])map(str => strToObject(str)) (MyTrait.apply _)

  val jsonObject = Json.parse(Json.toJson(object1).toString)
  val aux = jsonObject \ "t"
  val myobject = aux.as[MyTrait]

它抱怨 (MyTrait.apply _) 和 [MyTrait] 带有“未找到:值 MyTrait”。然而,这与我对标准课程所做的完全相同,所以我真的不知道如何进行。

有什么想法吗?我是 Play 的新手(当然也是 Scala 的新手),所以我可能在做一些非常基本的错误。特别是,我高度怀疑“地图”调用。

干杯,

【问题讨论】:

  • 最新版本自动支持密封特征

标签: json scala playframework-2.0


【解决方案1】:

特征没有应用方法,这些通常与案例类一起使用。 您可以扩展 Reads 特征并实现 reads 方法,如下所示:

implicit val creatureReads = new Reads[MyTrait] {
  override def reads(js: JsValue): JsResult[MyTrait] = {
    JsSuccess(strToObject((js \ "t" ).as[String]))
  }
}

我编辑了我的答案以返回一个 JsSuccess,您可以添加更好的验证来检查“t”是否存在。

您的代码也应该调用:

val myobject = jsonObject.as[MyTrait]

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2023-03-16
    • 2019-04-04
    • 1970-01-01
    相关资源
    最近更新 更多