将具有未知属性名称的 JSON 解析为案例 Class
Parse JSON with unknown attributes names into a Case Class
我有以下 JSON 文件要解析成一个案例 class:
{
"root": {
"nodes": [{
"id": "1",
"attributes": {
"name": "Node 1",
"size": "3"
}
},
{
"id": "2",
"attributes": {
"value": "4",
"name": "Node 2"
}
}
]
}
}
问题是属性中可以有任何值:名称、大小、值、任何...
此刻我已经定义了我的案例classes:
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处理子文件
谢谢!
您的属性任意多且命名不同,但您似乎可以将它们存储在 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 中。)
我有以下 JSON 文件要解析成一个案例 class:
{
"root": {
"nodes": [{
"id": "1",
"attributes": {
"name": "Node 1",
"size": "3"
}
},
{
"id": "2",
"attributes": {
"value": "4",
"name": "Node 2"
}
}
]
}
}
问题是属性中可以有任何值:名称、大小、值、任何...
此刻我已经定义了我的案例classes:
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处理子文件
谢谢!
您的属性任意多且命名不同,但您似乎可以将它们存储在 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 中。)