2011-11-23 18 views
0

我試圖提取下面的JSON值使用Scala電梯JSON的情況下,提取類時JSON是可變

// a 'Change item with a list of values 
{ 
     "@count":"2", 
     "change":[{ 
     "@webLink":"http://localhost:8080/viewModification.html?modId=6&personal=false", 
     "@version":"b51fde683e206826f32951750ccf34b14bead9ca", 
     "@id":"6", 
     "@href":"/httpAuth/app/rest/changes/id:6" 
     },{ 
     "@webLink":"http://localhost:8080/viewModification.html?modId=5&personal=false", 
     "@version":"826626ff5d6bc95b32c7f03c3357b31e4bf81842", 
     "@id":"5", 
     "@href":"/httpAuth/app/rest/changes/id:5" 
     }] 
    } 

// a 'Change item with a single value 
{ 
     "@count":"1", 
     "change":{ 
     "@webLink":"http://localhost:8080/viewModification.html?modId=8&personal=false", 
     "@version":"803f9c1cd2c553c3b3fb0c950585be868331b3b1", 
     "@id":"8", 
     "@href":"/httpAuth/app/rest/changes/id:8" 
     } 
} 

我有以下的情況下,類

case class ChangeItem(`@count`: String, change: List[ChangeItemDetail]) { 
    def this(`@count`: String, change: ChangeItemDetail) = this(`@count`, List(change)) 
} 
case class ChangeItemDetail(`@webLink`:String, `@version`:String, `@id`:String, `@href`: String) 

但隨着升降機的json只有具有多個項目的JSON示例似乎工作,單個項目會拋出。

 parse(listEx).extract[ChangeItem] // OK 
     parse(singleEx).extract[ChangeItem] // throws 

有沒有解決方案?

回答

2

解決此問題的一種方法是通過將JSON轉換爲統一格式來「修復」JSON。

val json = parse(origJson) transform { 
    case JField("change", o: JObject) => JField("change", JArray(o :: Nil)) 
} 

json.extract[ChangeItem] 

這將在兩種情況下都起作用。

+0

有什麼方法可以在case類中編碼這個信息,這樣解析解析/提取代碼可以是通用的? –

+0

不,但我在這裏看不到問題。您已經知道要提取哪種類型,只需在此處轉換JSON即可。 – Joni

相關問題