2013-07-08 35 views
3

我正在嘗試在使用json4s的Scala應用程序中生成JSON。相當簡單,下面是一些樣本值我放在一起,以測試它在我的Scalatra的應用程序:使用json4s在Scala應用程序中生成json

import org.json4s._ 
import org.json4s.JsonDSL._ 


object JsonStub { 
    val getPeople = 
     ("people" -> 
      ("person_id" -> 5) ~ 
      ("test_count" -> 5)) 

} 

在我的控制,我只是有:

import org.json4s._ 
import org.json4s.JsonDSL._ 
import org.json4s.{DefaultFormats, Formats} 

class FooController(mongoDb: MongoClient)(implicit val swagger: Swagger) extends ApiStack with NativeJsonSupport with SwaggerSupport { 

get ("/people", operation(getPeople)) { 
     JsonStub.getPeople 
    } 

} 

輸出我看到在瀏覽器然而,如下:

{ 
    "_1": "people", 
    "_2": { 
    "person_id": 5, 
    "test_count": 5 
    } 
} 

任何線索,其中_1_2密鑰來自哪裏?我期待這個輸出,而不是:

{ 
    "people":{ 
    "person_id": 5, 
    "test_count": 5 
    } 
} 

回答

5

你看到的輸出是一個反思系列化元組,其中有場_1_2。這是因爲編譯器爲JsonStub.getPeople推斷的返回類型是Tuple2[String, JObject]

json4s DSL使用隱式轉換將元組變成JValue。但是,如果你不告訴編譯器你想要一個JValue,它不會應用轉換。

理想情況下,這會導致編譯錯誤,因爲您試圖從非正確類型的東西中生成JSON。不幸的是,因爲你的web框架假設你想要回退到基於反射的序列化,這意味着有另一種方法可以將元組變成JSON,這不是你想要的。

如果你明確地告訴編譯器你想要一個JValue而不是一個Tuple2,DSL的隱式轉換將被應用在正確的位置。

val getPeople: JValue = 
    ("people" -> 
     ("person_id" -> 5) ~ 
     ("test_count" -> 5)) 
+0

這樣做本,非常感謝。任何提示,我怎麼能想出這一個沒有發佈在這裏呢? :-)在這裏也許有一種方法可以將我所有的值都默認爲JValue,只是不完全確定如何。 – randombits

+0

如果你想要類型安全的開發,我的專業提示是不使用Scalatra。除此之外,爲API的公共成員指定返回類型總是一個好主意,尤其是*在依賴含義時。 –

+3

有沒有辦法告訴json4s明確地進行轉換?我遇到了同樣的事情,我寧願不用用JValues來拋棄我的模型類。 –

相關問題