如何在使用Scala Play Json框架解析Json时获取键和值?

如何在使用Scala Play Json框架解析Json时获取键和值?,json,scala,bigdata,jsonparser,play-json,Json,Scala,Bigdata,Jsonparser,Play Json,我有一个json文件,其中包含一些键和值。我需要解析Json并打印键及其值。例如,json文件如下所示。我想将其打印为键和值 { "Parcer":[ { "key":"0203", "value":{ "Encryption": { "enabled":"yes",

我有一个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"
                                                }
                                        }
                            }
                         ]

                }
          }],
  }```


最简单的方法是创建一个
案例类
,如:

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]
}
现在,您可以使用一个很好的
案例类

  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]
返回
JsSuccess(MyObj(头值,向量(映射(a->a_val,b->b_val,c->c_val),映射(a->a_val,b->b_val,c->c_val)),)

println
返回:
向量(a_val,a_val)


这在文档中有描述:

如果
value
中的值不总是字符串(多么可怕的句子…),映射可以更改为
value:Seq[Map[String,Any]]
。可能需要考虑:-)我们如何处理“a”中的嵌套值?我们可以指定JsPath而不是“a”吗?然后您不需要首先将其转换为
案例类
-但我无法帮助您,因为我总是使用我在回答中向您展示的方式编辑我的问题并用这个json检查您的答案。但它不起作用。我是斯卡拉的新手。对不起,我犯了错误。
  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
  }