【问题标题】:Play Json Reads and String播放 Json 读取和字符串
【发布时间】:2014-10-31 22:13:00
【问题描述】:

我在 Play 2.3 中有以下 JSON 阅读器:

import play.api.libs.json._
import play.api.libs.json.Reads._
val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength(3))

编译器给了我错误

diverging implicit expansion for type play.api.libs.json.Reads[M]
starting with method ArrayReads in trait DefaultReads

如果我使用 implicit val 我会得到

 ambiguous implicit values:
 both value uuidReads in trait DefaultReads of type => play.api.libs.json.Reads[java.util.UUID]
 and value airportSearchReads in object AirportSearch of type => play.api.libs.json.Reads[String]
 match expected type play.api.libs.json.Reads[M]

如何让它工作?

【问题讨论】:

    标签: json scala playframework playframework-2.0 playframework-json


    【解决方案1】:

    我得到一个不同的错误,但如果我向minLength 添加显式类型参数,它对我来说很好:

    scala> val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength[String](3))
    airportSearchReads: play.api.libs.json.Reads[String] = play.api.libs.json.Reads$$anon$8@3fee86da
    

    我认为将其留给编译器的问题在于,范围内有不同的隐式组合可以满足 minLength 的隐式参数列表。

    【讨论】:

      【解决方案2】:

      DefaultReads 为您提供将 json 值转换为常见类型(StringOptionArray 等)所需的读者。所以没有必要为String 提供新的阅读器。

      因此,要访问 json 对象中的字段,您不需要定义读取器,除非您想将该字段读入您的任意类型。

      在这种情况下,您需要的只是在ReadsConstraints 中定义的约束。所以假设你的 json 对象是jsValue,下面的代码给你你想要的:

      // val jsValue = ...
      
      (jsValue \ "search").as[String](Reads.minLength(3))
      

      【讨论】:

      • 你删除了你的隐式阅读器吗? (先删除val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength(3))。
      • 仍然是同样的问题......虽然顶部的解决方案有效,所以我会使用它。非常感谢您的帮助
      猜你喜欢
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 2016-03-07
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多