使用 json4s-jackson 解析 JObject 的键和值

Parsing JObject for key and values with json4s-jackson

如何获取列表中每个 JObject 的键 scenario0scenario1

大便是:

poop: List[org.json4s.JsonAST.JValue] = List(JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))), JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))))

代码:

import org.json4s.jackson.JsonMethods._
import org.json4s._

implicit val formats = DefaultFormats

val json = parse("""
         {
            "address0": {
              "scenario0": {
                "street": "Bulevard",
                "city": "Helsinki"
              },
              "scenario1": {
                "street": "Bulevard",
                "city": "Helsinki"
              }
            },
            "address1": {
              "scenario0": {
                 "street": "Bulevard",
                 "city": "Helsinki"
               },
               "scenario1": {
                 "street": "Bulevard",
                 "city": "Helsinki"
               }
            }
         }""")

val poop = (json \ "address0").children
poop.foreach(p => {

})

你是说你想要这样吗,因为每个人都JObject

json.children.flatMap(_.children) 
res13: List[JValue] = List(
  JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))),
  JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))),
  JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))),
  JObject(List((street,JString(Bulevard)), (city,JString(Helsinki))))
)

但是您可能会发现使用 circe、play-json 或 argonaut 等库将它们解析为案例 class 更有用。这样你就不必到处解析 json。

  1. 如果您需要值但没有固定架构: val poop: Map[String, Any] = json.asInstanceOf[JObject].values returns Map(address0 -> Map(scenario0 -> Map(street -> Bulevard, city -> Helsinki), scenario1 -> Map(street -> Bulevard, city -> Helsinki)), address1 -> Map(scenario0 -> Map(street -> Bulevard, city -> Helsinki), scenario1 -> Map(street -> Bulevard, city -> Helsinki)))
  2. 如果您需要值并且有固定的模式,那么 extracting of case class 可能会有用。
  3. 如果你需要 AST:val poop = json.asInstanceOf[JObject].obj 给出 List[org.json4s.JsonAST.JField] = List((address0,JObject(List((scenario0,JObject(List((street,JString(Bulevard)), (city,JString(Helsinki))))), (scenario1,JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))))))), (address1,JObject(List((scenario0,JObject(List((street,JString(Bulevard)), (city,JString(Helsinki))))), (scenario1,JObject(List((street,JString(Bulevard)), (city,JString(Helsinki)))))))))

p.s。为了简单起见,我省略了监护人检查。