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

标签 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))

}

在我的 Controller 中,我只有:

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_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))

关于json - 使用 json4s 在 Scala 应用程序中生成 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17534498/

相关文章:

Scala:如何在未来打印列表

javascript - 对 Play REST 服务器的 Angular 2 http 请求

javascript - 有没有办法自动创建用于语言翻译的 .json 文件?

scala - 为什么 mutable.Map 不扩展 immutable.Map?

scala - Scala类参数化中附加冒号的含义

unit-testing - 测试期间的 Scalatra Servlet init() (Jetty ServletTester)

html - 使用 json 作为 Assemble.io 的数据源

python - 在 python/pymongo 中将 bson 转换为 json

scalatra 2.2.0升级遇到NoClassDefFoundError :GenTraversableLike

javascript - 从 Angular js表单发布数据时出错