2017-09-05 49 views
1

我得到給定的(例如)JSON:解析JSON列表Scala中兩個列表,瑟茜

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

元素列表總是包含有類型的對象 「節點X」 和屬性:ID一個b或類型爲「nodeY」的物體和屬性:idc

我使用瑟茜(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]) 

但urfortunately我買了可選字段對象的元素列表。我需要給定類的兩個列表:

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

所以現在我用這:

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元素。

感謝提前:)

+0

你怎麼解碼?半自動派生解碼器? – michaJlS

+0

@michaJlS我用'decode [MyJson](json)'解碼,我對circe沒有經驗。我讀過半自動派生解碼器,但我不知道如何使用 – BoyFarmer

+0

你將不得不顯示你的解析代碼,並告訴你從這個JSON中取出的位置。 – michaJlS

回答

0

如果允許你定義NodeXNodeY類作爲ADT與密封的特點,它可以通過jsoniter-scala可以輕鬆解析。

庫添加到您的依賴列表

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

定義你的case類:

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