代码之家  ›  专栏  ›  技术社区  ›  agusgambina

Scala Play Framework 2.6格式到Json

  •  1
  • agusgambina  · 技术社区  · 7 年前

    currency 作为一个封闭的特征 Currency

    case class Payment(
      id: Long,
      amount: BigDecimal,
      currency: Currency
    )
    
    object Payment {
      implicit val paymentFormat = Json.format[Payment]
      val tupled = (this.apply _).tupled
    }
    

    这个封闭的特征

    sealed trait Currency { def name: String }
    case object EUR extends Currency { val name = "eur" }
    case object USD extends Currency { val name = "usd" }
    case class UnknownCurrency(name: String) extends Currency
    

    我希望能够将对象转换为json Json.toJson(payment)

    object Currency {
      implicit object CurrencyFormat extends Format[Currency] {
        implicit def reads(json: JsValue) =
          json match {
            case JsString("eur") => JsSuccess(EUR)
            case JsString("usd") => JsSuccess(USD)
            case _ => JsError("cannot parse it")
          }
        implicit def writes(currency: Currency) = JsString(currency.name.toString)
      }
    }
    

    当我试图编译这个项目时,我得到了这个错误

    2 回复  |  直到 7 年前
        1
  •  1
  •   Argurth    7 年前

    当我们最终在问题评论中解决了您的问题时,我在这里发布了修复评论作为答案:

    出现以下错误:

    隐式作用域

    implicit lazy val currencyFormat: Format[Currency] = Currency.CurrencyFormat
    

    因此,如果有人有类似的问题,请检查您是否正确导入了Format实例;)

        2
  •  3
  •   Lasf    7 年前

    改为这样做:

    object Currency {
    
      implicit val reads: Reads[Currency] = Reads {
        case JsString("eur") => JsSuccess(EUR)
        case JsString("usd") => JsSuccess(USD)
        case _ => JsError("cannot parse it")
      }
    
      implicit val writes: Writes[Currency] = Writes { currency =>
        JsString(currency.name.toString)
      }
    
    }
    
    推荐文章