java jackson jobject_在Scalatra中响应JSON格式的诸多问题

7d1b37e7bdc51bd31b755388652ab34f.png

先看一个最简单的例子,假如我有这样一个entitycase 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-jackson、scalatra-json包,然后在Servlet中定义一个隐式延迟常量jsonFormatsprotected implicit lazy val jsonFormats: Formats = DefaultFormats复制代码

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

contentType = formats("json")

}复制代码

正常情况下我们就可以得到预期结果了[{"value":"foo"},{"value":"bar"}]复制代码

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

FAQ为什么完全没有效果,仍然显示默认的输出,也没有报错?

没有成功导入scalatra-json包,没有引入scalatra-json包就不处理jsonFormats和formats("json"),所以不会报错,也不会提示你缺少引入,也可能是没有在servlet上with JacksonJsonSupport如果需要响应的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")

}复制代码需要响应的json内容十分灵活,field是动态的,所以我不想为返回的json单独写一个实体类,怎么做比较简单?

可以直接返回JObject的,scalatra-json是会自动解析的,所以按json4s的写就好了,可以用JsonDSL的~动态组装jsonimport org.json4s.JsonDSL._

get("/") {

("foo" -> "1") ~ ("bar" -> "2")

}复制代码

得到{"foo":"1","bar":"2"}复制代码如何使用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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值