2017-09-05 5 views
1

내가 주어진있어 (예) JSON : ID, :구문 분석 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"와 속성을 포함 입력 "nodeY"및 특성 B 또는 객체 : ID 및 C.

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]) 

을하지만 urfortunately 내가 선택적 필드와 객체 요소의 목록을 가지고 :

나는 수업이 JSON을 구문 분석 키르케 (스칼라 라이브러리)을 사용하고 있습니다. 나는 주어진 클래스의 두 목록을 얻을 필요가 : 지금 내가 사용하고 있으므로

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

이이 JSON의 목록은 결코 미만 70K가 포함되어 있기 때문에 내가 더 나은 솔루션, 빠른 솔루션을 찾고 있어요

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] 
    } 

을 집단. 당신이 밀봉 특성과 ADT으로 NodeXNodeY 클래스를 정의하는

+0

를 사용 :

케이스 클래스를 정의 의존성 목록

libraryDependencies += "com.github.plokhotnyuk.jsoniter-scala" %% "macros" % "0.7.2" 

에 라이브러리를 추가 ? 세미 오토 파생 디코더? – michaJlS

+0

@michaJlS 나는'decode [MyJson] (json)'으로 해독한다. 나는 circe에 익숙하지 않다. 나는 semi-auto 파생 된 디코더에 대해서 읽었지 만, 사용법에 대해서는 전혀 모른다. – BoyFarmer

+0

파싱 코드를 보여주고이 json에서 어디로 가져 가야하는지 말해야 할 것이다. – michaJlS

답변

0

: 사전에

덕분에이 쉽게 jsoniter-scala에 의해 구문 분석 할 수있는, 허용됩니다.

sealed trait Node 
final case class NodeX(val id:Long, val a:Long, val b:Long) extends Node 
final case class NodeY(val id:Long, val c:List[String]) extends Node 

case class MyJson(val version:Double, val author:String, val elements:List[Node]) 

루트의 경우 클래스의 코덱을 생성하고 디코딩 어떻게

import java.io._ 
import com.github.plokhotnyuk.jsoniter_scala.macros._ 
import com.github.plokhotnyuk.jsoniter_scala.core._ 

val myJsonCodec = JsonCodecMaker.make[MyJson](CodecMakerConfig()) 

val myJson = { 
    val fin = new FileInputStream("/tmp/my.json") 
    try JsonReader.read(codec, fin) 
    finally fin.close() 
}