2013-03-25 31 views
0

我非常新的斯卡拉/提升跑進以下問題:消息:net.liftweb.json.MappingException:不知道如何反序列化

class Tests { 
case class JTest(
     thisUrl:String, 
     id:Int, 
     desc:String, 
     results:String, 
     isEnabled:Boolean, 
     attackerAppliance:String, 
     victimAppliance:String, 
     lastModified:String) 

def displayTest(in: NodeSeq): NodeSeq = { 
implicit val formats = DefaultFormats.withHints(
      ShortTypeHints(List(classOf[JTest]))) 

val content = fromInputStream(url.openStream).getLines.mkString("\n") 

     val json = parse(content) 
     val test = json.extract[JTest] 
     Helpers.bind("test", in, 
      AttrBindParam("thisUrl", test.thisUrl, "href"), 
      "id" -> test.id, 
      "desc" -> test.desc, 
      "results" -> test.results, 
      "isEnabled" -> test.isEnabled, 
      "attackerAppliance" -> test.attackerAppliance, 
      "victimAppliance" -> test.victimAppliance, 
      "lastModified" -> test.lastModified) 

} 
} 

我獲得以下錯誤信息:

Message: net.liftweb.json.MappingException: Do not know how to deserialize 'JTest' 

樣品JSON:

{"jsonClass":"JTest","thisUrl":"/api/test/1","id":1,"desc":"Vulnerability in Server Service","results":"/api/test/1/results","isEnabled":true,"attackerAppliance":"/api/appliance/2","victimAppliance":"/api/appliance/6","lastModified":"2012-08-08 11:46:29.004"} 

我試過幾件事情,但它接縫我堅持在這裏。任何一個人都可以指向正確的方向嗎? BTW。我正在使用Scala 2.7.7!

乾杯,ENZO

+0

你可以發佈你試圖解析的JSON樣本嗎?另外,是否有你必須使用Scala 2.7.7的原因? – jcern 2013-03-25 12:29:01

+0

json示例: {「jsonClass」:「JTest」,「thisUrl」:「/ api/test/1」,「id」:1,「desc」:「服務器服務中的漏洞」,「結果」/API /測試/ 1 /結果 「 」的IsEnabled「:真 」attackerAppliance「: 」/ API /器具/ 2「, 」victimAppliance「: 」/ API /器具/ 6「, 」上次更改時間「:」 2012-08 -08 11:46:29.004「} 關於版本:不,用2.7.7有問題嗎? – enzo 2013-03-25 12:32:01

回答

0

如果您從JSON輸入刪除jsonClass提示,應該解析。喜歡的東西:

{"thisUrl":"/api/test/1", 
"id":1, 
"desc":"Vulnerability in Server Service", 
"results":"/api/test/1/results", 
"isEnabled":true, 
"attackerAppliance":"/‌​api/appliance/2", 
"victimAppliance":"/api/appliance/6", 
"lastModified":"2012-08-08 11:46:29.004"} 

否則,你可以嘗試添加[]在你的輸入,如:

[{"jsonClass":"JTest", 
"thisUrl":"/api/test/1", 
"id":1, 
"desc":"Vulnerability in Server Service", 
"results":"/api/test/1/results", 
"isEnabled":true, 
"attackerAppliance":"/‌​api/appliance/2", 
"victimAppliance":"/api/appliance/6", 
"lastModified":"2012-08-08 11:46:29.004"}] 

我認爲這是尋找一個集合,因爲jsonClass屬性用於幫助確定反序列化哪些亞型當前項目。可能有一種方法可以讓它與單個元素一起工作,但我不確定那是什麼。

我問起有關scala版本的原因是,2.7.7在這個時候很舊(2.10是最新的版本),而更新的版本可能使查找更容易一些。

+0

我現在更新到2.9並刪除了提示'隱式val格式= DefaultFormats'。我在Tests-class之外宣佈JTest。沒有任何變化我得到相同的錯誤信息。 – enzo 2013-03-25 16:35:47

+0

對不起,我正在測試一些東西給你,並混淆了兩個問題。我澄清了我能夠工作的兩個項目,希望其中的一個能夠幫助您前進。兩者都適用於您的原始代碼。 – jcern 2013-03-25 17:03:37

+0

感謝您的幫助!問題是我從服務器獲取json。那麼是否有可能解析json刪除類提示,然後反序列化它? json.filter case JField(「jsonClass」,JString(「JTest」))=> false case _ => true }'和'json remove {_ == JField(「jsonClass」, JString(「JTest」))}'。沒有任何工作正確:S – enzo 2013-03-26 12:19:30