【发布时间】:2018-02-14 06:00:59
【问题描述】:
我得到了(示例)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”和属性:id、a 和 b。
- 键入“nodeY”和属性:id 和 c。
我想获取给定类的两个列表:
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 的元素。
提前致谢:)
【问题讨论】:
-
你是如何解码的?半自动派生解码器?
-
@michaJlS 我用
decode[MyJson](json)解码,我对circe 没有经验。我阅读了有关半自动派生解码器的信息,但我不知道如何使用 -
你必须展示你的解析代码并告诉你从这个 json 中获取的位置。
标签: json scala list parsing circe