【问题标题】:unable to understand Read[T]JsPath example in documentation无法理解文档中的 Read[T]JsPath 示例
【发布时间】:2017-03-10 21:02:44
【问题描述】:

我无法理解 JsPath 的示例代码并阅读文档

https://www.playframework.com/documentation/2.2.1/ScalaJsonCombinators

import play.api.libs.json._
import play.api.libs.functional.syntax._

问题 1 - 我们创建了一个自定义阅读器。 Reads 应该能够读取由 String、Float 和 List 组成的数据结构。但在下面的示例中,我们将其传递给 Json! Json 是如何转换为(String、Fload 和 List)的?

问题 2 - 我们使用 JsPath \"key1" 但我们在哪里传递了 JSON?

val customReads: Reads[(String, Float, List[String])] = 
  (JsPath \ "key1").read[String](email keepAnd minLength(5)) and 
  (JsPath \ "key2").read[Float](min(45)) and
  (JsPath \ "key3").read[List[String]] 
  tupled

import play.api.libs.json.Json

val js = Json.obj(
  "key1" -> "alpha", 
  "key2" -> 123.345F, 
  "key3" -> Json.arr("alpha", "beta")
)

res5: JsSuccess(("alpha", 123.345F, List("alpha", "beta")))

scala> customReads.reads(js) 
customReads.reads(js).fold(
      invalid = { errors => ... },
      valid = { res => 
        val (s, f, l): (String, Float, List[String]) = res
        ...
      }
    )

【问题讨论】:

    标签: json playframework


    【解决方案1】:

    问题 1

    我们创建一个自定义阅读器。

    是的

    Reads 应该能够读取由 String、Float 和 List 组成的数据结构。

    没有

    val customReads: Reads[(String, Float, List[String])]= ...
    

    表示customReadsReads类型的变量,而Reads.reads必须返回类型为(String, Float, List[String])的元组

    但在下面的示例中,我们将它传递给 JSON! JSON 如何转换为(字符串、浮点数和列表)?

    Reads.reads 是一个函数,它以 JSON 作为参数并返回一些值,通过定义的规则从 JSON 中提取。在我们的例子中,规则是:

    (JsPath \ "key1").read[String](email keepAnd minLength(5))
    

    (JsPath \ "key2").read[Float](min(45)) 
    

    (JsPath \ "key3").read[List[String]] 
    

    所有这些值都必须是

    tupled
    

    所以我们的Reads.reads 函数返回(String, Float, List[String]) 元组。

    问题 2

    我们使用 JsPath \"key1" 但是我们在哪里传递了 JSON?

    JsPath \ "key1" 不是处理 JSON 的实际代码,它是处理 JSON 的规则。即它就像 XPath 表达式 /key1

    【讨论】:

    • 你的解释很有道理。一个后续问题——“读取”在哪里被覆盖? scala 文档将“读取”声明为abstract def reads(json: JsValue): JsResult[A]。我猜必须与应用方法def apply[A](f: JsValue => JsResult[A]): Reads[A] = new Reads[A] { def reads(json: JsValue) = f(json) } 相关,但我无法加入这些点。
    • 里面的代码很复杂,就像从函数中创建函数并改变函数一样。所以(JsPath \ "key1").read[String] 创建一些函数,然后and 创建另一个函数,该函数与下一个(JsPath \ "key2").read[String] 组合,依此类推,tupled 创建Read 对象与reads 定义的函数以前的组合
    猜你喜欢
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多