使用json4s在Scala应用程序中生成json

时间:2013-07-08 19:32:29

标签: json scala scalatra json4s

我正在尝试使用json4s在Scala应用程序中生成JSON。相当简单,以下是我在Scalatra应用程序中测试它的一些示例值:

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
  }
}

1 个答案:

答案 0 :(得分: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))