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

从JSON解析到Case类时播放JSON错误

  •  0
  • joesan  · 技术社区  · 4 年前

    case class SmartMeterData(
         dateInterval: SmartMeterDataInterval = HalfHourInterval(),
         powerUnit: PowerUnit = PowerUnit.KWH,
         smartMeterId: String,
         timestamp: String,
         value: Double
    )
    

    这个case类包含在名为models的包中,在models包中我还有一个package对象,我在其中定义了所有隐式json映射。对于这种情况,我有以下含意:

    implicit val currencyReads: Reads[Currency] = new Reads[Currency] {
        def reads(json: JsValue): JsResult[Currency] =
          json match {
            case JsString(currency) => JsSuccess(Currency.getInstance(currency))
            case err => JsError(s"Invalid Currency format ${err.toString()}")
          }
      }
    
      implicit val currencyWrites: Writes[Currency] = new Writes[Currency] {
        def writes(currency: Currency): JsString = JsString(currency.toString)
      }
    
      // The default DateTime format that we use for all DateTime
      // values that this application produces
      val dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
      implicit val jodaDateReads: Reads[Imports.DateTime] = Reads[DateTime](js =>
        js.validate[String].map[DateTime](dtString =>
          DateTime.parse(dtString, DateTimeFormat.forPattern(dateFormat))
        )
      )
    
      implicit val jodaDateWrites: Writes[DateTime] = new Writes[DateTime] {
        def writes(d: DateTime): JsValue = JsString(d.toString())
      }
      
      implicit lazy val usagePriceFormat: OFormat[UsagePrice] = Json.format[UsagePrice]
      implicit lazy val providerFormat: OFormat[Provider] = Json.format[Provider]
      implicit lazy val electricityPriceFormat: OFormat[ElectricityPrice] = Json.format[ElectricityPrice]
    
      implicit lazy val hhIntervalFormat = Json.format[HalfHourInterval]
      implicit lazy val fhIntervalFormat = Json.format[FullHourInterval]
      implicit lazy val intervalFormat = Json.format[SmartMeterDataInterval]
    
      implicit val powerUnitReads: Reads[PowerUnit] = new Reads[PowerUnit] {
        def reads(json: JsValue): JsResult[PowerUnit] =
          json match {
            case JsString("KWH") => JsSuccess(PowerUnit.KWH)
            case JsString("WH") => JsSuccess(PowerUnit.WH)
            case JsString("MWH") => JsSuccess(PowerUnit.MWH)
            case err => JsError(s"Invalid PowerUnit format ${err.toString()}")
          }
      }
    
      implicit val powerUnitWrites: Writes[PowerUnit] = new Writes[PowerUnit] {
        def writes(powerUnit: PowerUnit): JsValue = powerUnit match {
          case WH => Json.toJson("WH")
          case KWH => Json.toJson("KWH")
          case MWH => Json.toJson("MWH")
        }
      }
    

    然后我开始编写一些简单的测试来解析JSON,我得到了以下错误:

    method fromJson: (implicit fjs: play.api.libs.json.Reads[T]): play.api.libs.json.JsResult[T] does not take type parameters.
        Json.fromJson(json)[SmartMeterData].asEither match {
    

    我想做的是:

    "SmartMeterData" should "parse from a JSON AST" in {
        val json: JsValue = Json.parse("""
          {
            "dateInterval" : "HH",
            "powerUnit" : "KWH",
            "smartMeterId" : "LCID-001-X-54",
            "timestamp" : "2012-10-12 00:30:00.0000000",
            "value" : 23.0
          }
          """)
        Json.fromJson(json)[SmartMeterData].asEither match {
          case Left(_) => fail("verdammt")
          case Right(smartMeterData) => {
            assert(smartMeterData.timeStamp equals "2012-10-12 00:30:00.0000000")
          }
        }
    }
    
    1 回复  |  直到 4 年前
        1
  •  0
  •   Tomer Shetah Anshul Jain    4 年前

    您应该首先提供类型,然后提供参数。电话应该是:

    Json.fromJson[SmartMeterData](json)
    

    不是

    Json.fromJson(json)[SmartMeterData]