Мне дали (пример) 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 не содержит менее 70 тыс. Элементов.
Заранее спасибо :)
decode[MyJson](json)
, у меня нет опыта работы с Circe. Я читал о полуавтоматических производных декодерах, но понятия не имею, как их использовать - person BoyFarmer   schedule 06.09.2017