gpt4 book ai didi

json - Scala circe中按字段值将json列表解析为两种列表类型

转载 作者:行者123 更新时间:2023-12-02 08:33:24 25 4
gpt4 key购买 nike

我得到了(示例)json:

{
"version": 1.1,
"author": "XYZ",
"elements": [{
"type": "nodeX",
"id": 1,
"a": 1,
"b": 2
},
{
"type": "nodeX",
"id": 2,
"a": 1,
"b": 2
},

...

{
"type": "nodeX",
"id": 13214,
"a": 1,
"b": 2
},
{
"type": "nodeY",
"id": 1,
"c": [
"qaz",
"wsx"
]
},
{
"type": "nodeY",
"id": 2,
"c": [
"qaz",
"wsx"
]
},

...

{
"type": "nodeY",
"id": 3,
"c": [
"qaz",
"wsx"
]
}
]
}

元素列表始终包含有两种可能性的对象:

  • 输入“nodeX”和属性:idab
  • 输入“nodeY”和属性:idc

我想获取给定类的两个列表:

case class NodeX(val id:Long, val a:Long, val b:Long)
case class NodeY(val id:Long, val c:List[String])

我尝试过 circe(Scala 库)将此 json 解析为类:

case class Element(val 'type':String, val id:Long, val a:Option[Long],val b:Option[Long], val c:Option[List[String]])
case class MyJson(val version:Double, val author:String, val elements:List[Element])

但不幸的是我得到了带有可选字段的对象元素列表。
目前我正在使用它作为解决方法:

val elements = // MyJson.elements
for (elem <- elements)
elem match {
case Element("nodeX", _,_,_,_) => //here convert to NodeX and add to list List[NodeX]
case Element("nodeY", _,_,_,_) => //here convert to NodeY and add to list List[NodeY]
}

我正在寻找更好、更快的解决方案,因为此 json 中的列表包含不少于 70k 的元素。

提前致谢:)

最佳答案

另一种方式是 Circe + Monocle 中的动态 Scala,它为您提供动态语言不安全的灵 active :

libraryDependencies += "io.circe" %% "circe-optics" % circeVersion
import io.circe.optics.JsonPath._
import io.circe.parser

val json = parser.parse(jsonString).right.get

case class NodeX(val id:Long, val a:Long, val b:Long)
case class NodeY(val id:Long, val c:List[String])

val nodexs = root.elements.each
.filter(root.`type`.string.getOption(_).contains("nodeX"))
.as[NodeX].getAll(json)
//res: List[NodeX] = List(NodeX(1L, 1L, 2L), NodeX(2L, 1L, 2L))
val nodeys = root.elements.each
.filter(root.`type`.string.getOption(_).contains("nodeY"))
.as[NodeY].getAll(json)
//res: List[NodeY] = List(NodeY(3L, List("qaz", "wsx")))

我相信circe-generic auto mode可以做与 Andriy Plokhotnyuk 的回答中描述的相同的事情。

关于json - Scala circe中按字段值将json列表解析为两种列表类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46063461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com