2015-07-11 80 views
1

我是斯卡拉特拉的新手。我有一個帶有JacksonJsonSupport的Servlet,它可以爲REST端點提供對象列表。如何在Scalatra中將對象類型序列化爲JSON?

class OperationsController extends MyappStack with JacksonJsonSupport { 

    before() { 
    contentType = formats("json") 
    } 

    get("/") { 
    Data.operations 
    } 
} 

Operation由或AddingRemovingcase類實現。 如何將GET /響應中的特定類添加到值中?我想獲得一個響應:

[ 
    { 
    "operation": "Adding", 
    "value": 100 
    } 
] 

而不是

[ 
    { 
    "value": 100 
    } 
] 

哪裏Adding是擴展Operation類。

+0

是否添加或刪除有狀態?你可以讓它們成爲案例對象嗎? – ka4eli

+0

他們是操作的案例類。 'case class添加擴展操作'。他們沒有額外的狀態參數。 – dmydlarz

回答

1

對於多型值json4s可以添加具體類型作爲附加字段。這就是所謂的「類型提示」:

[{ 
    "jsonClass": "Adding", 
    "value": 10 
}, { 
    "jsonClass": "Adding", 
    "value": 20 
}, { 
    "jsonClass": "Removing", 
    "value": 20 
}] 

這是例如使用ShortTypeHints

import org.json4s.{ShortTypeHints, DefaultFormats} 
import org.scalatra.ScalatraServlet 
import org.scalatra.json.JacksonJsonSupport 
import org.scalatra.test.specs2.MutableScalatraSpec 

sealed trait Operation 
case class Adding(value: Int) extends Operation 
case class Removing(value: Int) extends Operation 

class json1 extends MutableScalatraSpec { 

    mount(new ScalatraServlet with JacksonJsonSupport { 

    def typeHints = new ShortTypeHints(List(
     classOf[Adding], classOf[Removing] 
    )) 

    implicit lazy val jsonFormats = DefaultFormats + typeHints 

    before() { 
     contentType = formats("json") 
    } 

    get("/") { 
     List(
     Adding(10), 
     Adding(20), 
     Removing(20) 
    ) 
    } 

    }, "/*") 

    "Should return a list of operations" in { 

    get("/", headers = Seq("Content-type" -> "application/json")) { 
     println(body) 
     status should beEqualTo(200) 
    } 

    } 

} 
+0

的命題我會試試看,它看起來很有希望 – dmydlarz

+1

謝謝,這就是我一直在尋找:) – dmydlarz

1

我認爲,最簡單的辦法是更新像

case class Adding(value: Int, operation: String = "Adding") 
case class Removing (value: Int, operation: String = "Removing") 

另一種方法是使用自定義序列化更新您的jsonFormats你的case類,我發現例如jsons的自定義序列here

+0

我對複製信息不感興趣。此解決方案不滿足我,但感謝 – dmydlarz

0

json_conversion.scala文件我們創建的特質SimpleMongoDbJsonConversion我們用這MyScalatraServlet.scala文件,看下面的例子。

json_conversion.scala

package com.example.app 

import org.scalatra._ 
import com.mongodb.casbah.Imports._ 

trait SimpleMongoDbJsonConversion extends ScalatraBase with ApiFormats { 

    def renderMongo = { 
    case dbo: DBObject => 
     contentType = formats("json") 
     dbo.toString 

    case xs: TraversableOnce[_] => 
     contentType = formats("json") 
     val l = xs map (x => x.toString) mkString(",") 
     "[" + l + "]" 

    }: RenderPipeline 

    override protected def renderPipeline = renderMongo orElse super.renderPipeline 

} 

MyScalatraServlet.scala

package com.example.app 

import org.scalatra._ 
import com.mongodb.casbah.Imports._ 

class MyScalatraMongoServlet(mongoColl: MongoCollection) extends MyScalatraWebAppStack with SimpleMongoDbJsonConversion { 

    get("/") { 
    <html> 
     <body> 
     <h1>Hello, world!</h1> 
     Say <a href="hello-scalate">hello to Scalate</a>. 
     </body> 
    </html> 
    } 

    post("/insert") { 
    val key = params("key") 
    val value = params("value") 
    val newObj = MongoDBObject(key->value) 
    mongoColl += newObj 
    } 

    get("/users") { 
    mongoColl.find() 
    for { x <- mongoColl } yield x 
    } 

} 
相關問題