如何在使用 Scala-Play Json 框架解析 Json 时获取键和值?
Posted
技术标签:
【中文标题】如何在使用 Scala-Play Json 框架解析 Json 时获取键和值?【英文标题】:How to get Keys and values, while parsing Json using Scala-Play Json Framework? 【发布时间】:2019-04-02 05:40:35 【问题描述】:我有一个 json 文件,其中包含一些键和值。我需要解析 Json 并打印键及其值。例如,json 文件如下所示。我想将其打印为键和值
"Parcer":[
"key":"0203",
"value":
"Encryption":
"enabled":"yes",
"encryption_type":"base64",
"key":"334848484",
"return":"name"
,
"key":"0405",
"value":
"Encryption":
"enabled":"yes",
"encryption_type":"base64",
"key":"334848484",
"return":"none"
,
"Parcer":[
"key":"0102",
"value":"humidity"
,
"key":"0304",
"value":
"Encryption":
"enabled":"yes",
"encryption_type":"SHA1",
"key":"1211212",
"return":"none"
]
],
```
【问题讨论】:
【参考方案1】:最简单的方法是创建一个case class
,比如:
case class MyObj(header:String, value: Seq[Map[String, String]])
那么你只需要添加一行进行编组,比如:
import play.api.libs.json._
object MyObj
implicit val jsonFormat: OFormat[MyObj] = Json.format[MyObj]
现在你得到了一个很好的case class
,你可以使用它:
val json =
Json.parse(
"""
"header" : "header value",
"value" : [
"a" : "a_val",
"b" : "b_val",
"c" : "c_val"
,
"a" : "a_val",
"b" : "b_val",
"c" : "c_val"
]
""")
这里是一个如何检索所有"a"
的示例。
json.validate[MyObj] match
case JsSuccess(myObj, _) =>
val allAs =myObj.value.flatMap(m => m.get("a").toSeq)
println(allAs) // >> Vector(a_val, a_val)
case e:JsError => // handle error
这给了你:
json.validate[MyObj]
返回JsSuccess(MyObj(header value,Vector(Map(a -> a_val, b -> b_val, c -> c_val), Map(a -> a_val, b -> b_val, c -> c_val))),)
println
返回:Vector(a_val, a_val)
文档中对此进行了描述:JSON automated mapping
【讨论】:
如果value
中的值并不总是字符串(多么可怕的句子...),则可以将 Map 更改为 value: Seq[Map[String, Any]]
。可能是一个考虑因素:-)
我们如何处理“a”中的嵌套值?
我们可以指定 JsPath 而不是 "a" 吗?
那么您无需先将其翻译为case class
- 但我无法帮助您,因为我总是使用我在回答中向您展示的方式
编辑了我的问题并用这个 json 检查了你的答案。但它没有用。我是斯卡拉的新手。对错误感到抱歉。以上是关于如何在使用 Scala-Play Json 框架解析 Json 时获取键和值?的主要内容,如果未能解决你的问题,请参考以下文章
如何解压缩从 iPhone 上的服务器接收到的 gzip 文件?
如何使用 xcode 提取或解压缩 json 密钥(来自 API)?