将具有未知属性名称的JSON解析为Case类

问题描述 投票:1回答:1

我将以下JSON文件解析为案例类:

{
    "root": {
        "nodes": [{
                "id": "1",
                "attributes": {
                    "name": "Node 1",
                    "size": "3"
                }
            },
            {
                "id": "2",
                "attributes": {
                    "value": "4",
                    "name": "Node 2"
                }
            }
        ]
    }
}

问题是属性内部可能有任何值:名称,大小,值,任何东西......

这时我已经定义了我的案例类:

case class Attributes(
  name: String,
  size: String,
  value: Sting
)
case class Nodes(
  id: String,
  attributes: Attributes
)
case class Root(
  nodes: List[Nodes]
)
case class R00tJsonObject(
  root: Root
)

当我可以收到任何属性时,什么是处理这种情况的最佳方法?

目前我正在使用Json4s来处理子文件。

谢谢!

json scala case-class
1个回答
2
投票

你的属性是任意多个和不同的名称,但似乎你可以将它们存储在Map[String, String](至少,如果这些例子是任何东西)。在这种情况下,使用circe-parser(https://circe.github.io/circe/parsing.html),你可以简单地沿着这些行使用代码,以便将你的JSON直接转换为一个简单的case-class:

import io.circe._, io.circe.parser._
import io.circe.generic.semiauto._

case class Node(id: String, attributes: Map[String,String])
case class Root(nodes: List[Node])

implicit val nodeDecoder: Decoder[Node] = deriveDecoder[Node]
implicit val nodeEncoder: Encoder[Node] = deriveEncoder[Node]

implicit val rootDecoder: Decoder[Root] = deriveDecoder[Root]
implicit val rootEncoder: Encoder[Root] = deriveEncoder[Root]

def myParse(jsonString: String) = {
  val res = parse(jsonString) match {
    case Right(json) => {
      val cursor = json.hcursor
      cursor.get[Root]("root")
    }
    case _ => Left("Wrong JSON!") 
  }
  println(res)
}

这个片段将打印出来

Right(Root(List(Node(1,Map(name -> Node 1, size -> 3)), Node(2,Map(value -> 4, name -> Node 2)))))

在控制台上,对于JSON,你已经给出了。 (假设,解决方案不必在Json4s中。)

© www.soinside.com 2019 - 2024. All rights reserved.