如何在使用 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 时获取键和值?的主要内容,如果未能解决你的问题,请参考以下文章

如何解组 JSON?

如何解压缩从 iPhone 上的服务器接收到的 gzip 文件?

如何使用 xcode 提取或解压缩 json 密钥(来自 API)?

Akka HTTP:如何将 Json 格式响应解组为域对象

如何在 Java 中压缩 JSON 并在 Javascript 中解压缩 [关闭]

如何解压缩数据框列中存在的 json 的键,值将转换为键作为列,而使用 python 将其值转换为列?