Json 无法理解文档中的Read[T]JsPath示例

Json 无法理解文档中的Read[T]JsPath示例,json,playframework,Json,Playframework,我无法理解JsPath的示例代码,也无法阅读文档 问题1-我们创建了一个自定义阅读器。Reads应该能够读取由字符串、浮点和列表组成的数据结构。但在下面的示例中,我们将传递一个Json!Json是如何转换为(字符串、Fload和列表)的 问题2-我们使用JsPath \“key1”,但我们在哪里传递了JSON val customReads: Reads[(String, Float, List[String])] = (JsPath \ "key1").read[String](ema

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

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

问题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
        ...
      }
    )

问题1

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

Reads应该能够读取由字符串、浮点和列表组成的数据结构

没有

表示
customReads
Reads
类型的变量,并且
Reads.Reads
必须返回
类型的元组(字符串、浮点、列表[字符串])

但在下面的示例中,我们将传递一个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])
元组

问题2

(JsPath \ "key2").read[Float](min(45)) 
我们使用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
        ...
      }
    )

JsPath\“key1”
不是处理JSON的实际代码,而是处理JSON的规则。i、 这就像XPath表达式
/key1

您的解释很有道理。后续问题-在哪里覆盖“读取”?scala文档将“reads”声明为
抽象def reads(json:JsValue):JsResult[A]
。我猜is必须与apply方法有关,但是我无法连接点。里面的代码很复杂,就像从函数中创建函数并更改函数一样。因此
(JsPath\“key1”)。读取[String]
创建一些函数,然后
创建另一个与下一个
(JsPath\“key2”)组合的函数。读取[String]
,依此类推,使用
reads
函数创建
Read
对象,该函数是根据前面的组合定义的