2017-09-05 15 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" とプロパティが含まれていますbまたはタイプ「nodeY」およびプロパティ:idおよびcのオブジェクトです。

私はクラスにこのJSONを解析するためにキルケ(Scalaのライブラリ)を使用しています:

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内のリストが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] 
    } 

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

は今、私はこれを使用しています要素。事前に

感謝:)

+0

それを使用します。

あなたのケースクラスを定義し、あなたの依存関係リスト

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

にライブラリを追加します。 ?半自動派生型デコーダ? – michaJlS

+0

@michaJlS私は 'decode [MyJson](json)'でデコードしますが、私はcirceで経験はありません。私は半自動派生型デコーダについて読んでいますが、私は使用方法がわかりません – BoyFarmer

+0

あなたは解析コードを表示し、このjsonからどこに行くのかを伝えなければなりません。 – michaJlS

答えて

0

あなたはそれが簡単にjsoniter-scalaで解析することができ、密閉された形質にADTとしてNodeXNodeYクラスを定義することが許可されている場合。

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() 
}