2013-10-11 116 views
1

我想解析JSON在斯卡拉,我不是很成功。 這裏是我的JSON結構:斯卡拉解析遞歸JSON

{ 
    "data" : "test", 
    "field" : "test", 
    "listObj" : [{ 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } , { 
     "data" : "testInner2", 
     "field" : "testInner2" 
    }], 
    "obj" : { 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } 
} 

我使用的電梯進行解析。這裏是我的代碼:

import net.liftweb.json._ 

implicit val formats = DefaultFormats 
case class MyJson(data: String, field: String, obj: MyJson, listObj: List[MyJson]) 
val json = parse(""" 
{ 
    "data" : "test", 
    "field" : "test", 
    "listObj" : [{ 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } , { 
     "data" : "testInner2", 
     "field" : "testInner2" 
    }], 
    "obj" : { 
     "data" : "testInner1", 
     "field" : "testInner1" 
    } 
}""") 
println(json.extract[Query]) 

我有上帝以下異常:

Caused by: net.liftweb.json.MappingException: No usable value for operation 
Did not find value which can be converted into java.lang.String 
at net.liftweb.json.Meta$.fail(Meta.scala:191) 
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:357) 
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:317) 
at net.liftweb.json.Extraction$$anonfun$13.apply(Extraction.scala:253) 
at net.liftweb.json.Extraction$$anonfun$13.apply(Extraction.scala:253) 
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244) 
at scala.collection.immutable.List.foreach(List.scala:318) 
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244) 
at scala.collection.AbstractTraversable.map(Traversable.scala:105) 
at net.liftweb.json.Extraction$.instantiate$1(Extraction.scala:253) 
at net.liftweb.json.Extraction$.newInstance$1(Extraction.scala:286) 
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:315) 
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351) 
... 34 more 
Caused by: net.liftweb.json.MappingException: Did not find value which can be converted into java.lang.String 
at net.liftweb.json.Meta$.fail(Meta.scala:191) 
at net.liftweb.json.Extraction$.convert(Extraction.scala:403) 
at net.liftweb.json.Extraction$.net$liftweb$json$Extraction$$build$1(Extraction.scala:314) 
at net.liftweb.json.Extraction$.mkValue$1(Extraction.scala:351) 
... 46 more 

我一直在使用json4s嘗試,但我可以想辦法讓它解析成case類。當我從我的JSON中刪除obj和objList時,它運行良好。

任何人都可以指出我解析這種結構在Scala中讀取它的方式嗎?

+0

你的意思是「嵌套」,而不是「遞歸」?遞歸對象通常包含一個嵌套的指針。 – nafg

+0

nope。遞歸。 json對象包含它自己。 – Augusto

+0

它包含*本身*(如果是的話,你能幫我看看怎麼樣?),或者它包含一個* type *的對象? – nafg

回答

3

更改案例類定義,以便obj是一個可選值:

case class MyJson(data: String, 
    field: String, 
    // obj: MyJson,  // from 
    obj: Option[MyJson], // to 
    listObj: List[MyJson]) 

這是必要的,這樣的JSON提取仍能產生和MyJson實例即使JSON缺少"obj"場(它在你的例子中的嵌套結構內)。

這對於listObj並不需要,因爲json中缺少"listObj"字段仍然可以表示爲空列表List[MyJson]

+0

非常感謝你!工作得很好:) – Augusto