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

时间:2017-03-10 21:02:45

标签: json playframework

我无法理解文档中的JsPath和Read的示例代码

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

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

问题1 - 我们创建了一个自定义阅读器。读取应该能够读取由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
        ...
      }
    )

1 个答案:

答案 0 :(得分:0)

问题1

  

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

  

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

没有

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

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

  

但是在下面的例子中,我们传递了一个JSON!如何将JSON转换为(String,Float和List)?

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