Bar*_*icz 5 json scala playframework
考虑供应商API提供的以下JSON:
import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._
val json = Json.parse(
"""
|{
| "returns": {
| "markets" : {
| "ABC" : {
| "label": "ABC",
| "id":1
| },
| "DEF" : {
| "label": "DEF",
| "id":2
| }
| }
| }
|}
""".stripMargin)
Run Code Online (Sandbox Code Playgroud)
如何提取与"label"和"id"字段相关的一系列对.从这块JSON中我得到的结果是:
Seq((1,"ABC"),(2,"DEF"))
Run Code Online (Sandbox Code Playgroud)
我没有构建一个正确的JsPath提取器,因为它期望一个匹配,例如
val jsonTransformer = (__ \ 'returns \ 'markets).json.pick
json.transform(jsonTransformer)
Run Code Online (Sandbox Code Playgroud)
以下是我如何用漂亮的可组合部分构建这个解析器。首先对于丢弃键的通用对象到数组转换器:
\n\nval objToArray: Reads[JsArray] =\n JsPath.json.pickBranch.map(obj => JsArray(obj.fields.map(_._2)))\nRun Code Online (Sandbox Code Playgroud)\n\n现在对于Reads可以处理市场对象的:
val marketReads: Reads[(Int, String)] =\n ((__ \\ 'id).read[Int] and (__ \\ 'label).read[String]).tupled\nRun Code Online (Sandbox Code Playgroud)\n\n现在我们将它们联系在一起:
\n\nval pairsReads: Reads[List[(Int, String)]] = \n (__ \\ 'returns \\ 'markets).read(objToArray) andThen list(marketReads)\nRun Code Online (Sandbox Code Playgroud)\n\n最后:
\n\nscala> json.validate(pairsReads).foreach(println)\nList((1,ABC), (2,DEF))\nRun Code Online (Sandbox Code Playgroud)\n\n这就是你想要的。请注意,为了清楚起见,我已经指定了上面的类型,但这里没有必要\xe2\x80\x94我可能会在实际代码中将它们省略,因为这些片段非常小且简单。
\n| 归档时间: |
|
| 查看次数: |
2327 次 |
| 最近记录: |