首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用json4s在Scala应用程序中生成json

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

Stack Overflow用户
提问于 2013-07-09 03:32:29
回答 1查看 3.6K关注 0票数 3

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

代码语言:javascript
复制
import org.json4s._
import org.json4s.JsonDSL._


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

}

在我的控制器中,我只需要:

代码语言:javascript
复制
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
    }   

}

但是,我在浏览器中看到的输出如下所示:

代码语言:javascript
复制
{
  "_1": "people",
  "_2": {
    "person_id": 5,
    "test_count": 5
  }
}

知道_1_2密钥是从哪里来的吗?我期望的是下面的输出:

代码语言:javascript
复制
{
  "people":{
    "person_id": 5,
    "test_count": 5
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-09 03:48:45

您在输出中看到的是一个具有字段_1_2的反射式序列化元组。这是因为编译器为JsonStub.getPeople推断的返回类型是Tuple2[String, JObject]

json4s DSL使用隐式转换将像元组这样的值转换为JValue。但是,如果你不告诉编译器你需要一个JValue,它就不会应用转换。

理想情况下,这将导致编译错误,因为您试图从不正确的类型生成JSON。不幸的是,因为您的web框架假设您希望退回到基于反射的序列化,这意味着还有另一种方法可以将元组转换为JSON,而这并不是您想要的。

如果您显式地告诉编译器您需要的是JValue而不是Tuple2,则将在正确的位置应用DSL的隐式转换。

代码语言:javascript
复制
val getPeople: JValue = 
    ("people" ->
        ("person_id" -> 5) ~
        ("test_count" -> 5))
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17534498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档