2013-02-15 64 views
1

我正在研究一個小項目,嘗試讓Scala/Play後端工作。我試圖讓它返回並在Web服務端處理JSON。我似乎無法弄清楚如何讓JSON編組和解組工作。有人可以幫我解決這個問題嗎?我正在使用Play 2.1和Scala 2.10。我得到的錯誤是 「覆蓋方法讀入類型(json:play.api.libs.json.JsValue)的讀取方式play.api.libs.json.JsResult [models.Address];方法讀取具有不兼容的類型」JSON渲染Scala/Play 2.1

  • 編輯。其他人給了我解決方案。閱讀你必須使用JsSuccess,而不是JsResult。

    case class Address(id: Long, name: String) 
    
    object Address { 
    
    implicit object AddressFormat extends Format[Address] { 
    def reads(json: JsValue):Address = JsSuccess(Address(
        (json \ "id").as[Long], 
        (json \ "name").as[String] 
    )) 
    
    def writes(address: Address): JsValue = JsObject(Seq(
        "id" -> JsNumber(address.id), 
        "name" -> JsString(address.name) 
    )) 
    } 
    } 
    

回答

3

隨着播放2.1,你可以簡化代碼:

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

implicit val addressFormat = (
    (__ \ "id").format[String] and 
    (__ \ "name").format[Long] 
)(Address.apply, unlift(Address.unapply)) 

更詳細的信息可以在這裏找到:ScalaJsonCombinators

2

您可以通過使用宏進一步簡化代碼,雖然它們被標記爲實驗性的:

import play.api.libs.json._ 
import play.api.libs.functional.syntax._ 

case class Address(id: Long, name: String) 

implicit val addressFormat = Json.format[Address] 

More details on this technique在官方Play文檔中。

0

嘿我的解決辦法是:

import play.api.libs.json.JsonNaming.SnakeCase 
import play.api.libs.json._ 

object Test { 

    implicit val config = JsonConfiguration(SnakeCase) 
    implicit val userFormat: OFormat[Test] = Json.format[Test] 

} 

case class Test(
       testName: String, 
       testWert: String, 
       testHaus: String 
       ) 

總之,你會得到一個compenion對象。該配置將案例類的所有密鑰轉換爲蛇形。隱式值確保可以將有效的Json解析爲模型。所以你可以回到你的測試模型。

JSON的應該是這樣的:

{ 
    "test_name" : "Hello", 
    "test_wert": "Hello", 
    "test_haus": "Hello" 
} 

https://www.playframework.com/documentation/2.6.x/ScalaJsonAutomated

+0

哦,我沒有意識到,your're使用打2.1,它可能不會工作,IM SRY。我使用2.6,它更簡單 – 2018-01-12 21:32:50