位置:首页 > Scala > Scalatra 返回 JSON 时最容易踩的几个坑,顺手把正确写法梳理清楚

Scalatra 返回 JSON 时最容易踩的几个坑,顺手把正确写法梳理清楚

时间:2026-08-25  |  作者:骑光打字机  |  阅读:0

先看一个最简单的例子,假如我有这样一个entity

case class Entity(var value: String)

在Servlet的一个请求下,响应一个entity的列表

get("/") {
	List(Entity("foo"), Entity("bar"))
}

访问请求我们得到

List(Entity(foo), Entity(bar))

显然前端不习惯于解析这样奇怪的格式,如今的前端JSON已无处不在,如何使用json格式返回呢?

访问scalatra官网,右侧栏Formats下的JSON scalatra.org//guides/2.7…

官网建议我们使用json4s,导入json4s-jacksonscalatra-json包,然后在Servlet中定义一个隐式延迟常量jsonFormats

protected implicit lazy val jsonFormats: Formats = DefaultFormats

再实现一个ScalatraBase下的before()方法

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

正常情况下我们就可以得到预期结果了

[{"value":"foo"},{"value":"bar"}]

看上去很简单,但是坑并不少,下面盘点一些简单的问题

FAQ

  1. 为何毫无效果,依旧显示默认输出,也没报错呢? 原因在于未能成功导入scalatra-json包。若未引入该包,便不会处理jsonFormatsformats("json"),所以既不会报错,也不会提示你缺少引入。还有一种可能,是没有在servlet上使用with JacksonJsonSupport

  2. 如果需要响应的entity并非case class呢?

class Entity(var value: String)
get("/") {
	new Entity("foo")
}

它的响应结果是Entity@xxx,不会被自动解析,此时我们需要使用org.json4s.Serialization.write()

get("/") {
	Serialization.write(new Entity("foo")
}

它将响应正确的结果

{"value":"foo"}

由于Serialization的api比较简洁,建议将Serialization整个导入,直接使用write()

import org.json4s.jackson.Serialization._
get("/") {
	write(new Entity("foo"))
}
  1. 需要响应的json内容十分灵活,field是动态的,所以我不想为返回的json单独写一个实体类,怎么做比较简单? 可以直接返回JObject的,scalatra-json是会自动解析的,所以按json4s的写就好了,可以用JsonDSL~动态组装json
import org.json4s.JsonDSL._

get("/") {
    ("foo" -> "1") ~ ("bar" -> "2")
}

得到

{"foo":"1","bar":"2"}
  1. 如何使用jsonp? 在servlet中定义一个
override def jsonpCallbackParameterNames = Seq("jsonp")

在parameter中加参数jsonp标注回调函数名称,例如http:/localhost/jsonp=jsonpCallback ,就可以得到

/**/jsonpCallback({"foo":"1","bar":"2"});

Suggest

不妨将servlet视为mvc模式中的controller,接着定义一个ControllerBase,把jsonFormats放在里面,随后让所有的controller继承这个ControllerBase。可以参考这个项目Uniliva/tcc-fatec-back-end-scala,它就是这么做的哦。

如果要对一些类型做特殊处理,诸如date要使用自定义的SimpleDateFormat之类,建议参考AgreementInput.scala

官方文档涉及的问题凤毛麟角,而且例子代码都有问题,我看到有的例子还在用ja va.util.Date,这实在让人看不下去,建议在Stack Overflow和Github直接检索问题代码,关于scalatra的问题只有这两个大社区全面

《夸克》非常好用的免费AI浏览器

下载APP查看

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多