先看一个最简单的例子,假如我有这样一个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的问题只有这两个大社区全面

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

  1. java字符串数组转json_java中字符串String格式转化成json格式

    java字符串数组转json_java中字符串String格式转化成json格式 String s= Connection.deleteHost("10310");System.o ...

  2. 数据库中存储Json格式数据

    在数据库中存储Json格式数据 1.表字段类型 json 2.Java代码有两种方式: 方式一 :属性定义成String类型. 往数据库中存储的值 必须为JSON格式的字符串,因为数据库中会做一次校验 ...

  3. 在python中使用json格式存储数据

    在python中使用json格式存储数据 代码如下: import jsonlist1 = [{'A': [1, 2, 3, 4, 5, 6], 'B': [3, 4, 5, 6, 7]},{'C': ...

  4. 在JSP页面中输出JSON格式数据

    JSON-taglib是一套使在JSP页面中输出JSON格式数据的标签库. JSON-taglib主页: http://json-taglib.sourceforge.net/index.html J ...

  5. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

  6. pm2 start 带参数_pm2 start命令中的json格式详解

    就像苏南大叔所说的那样,pm2 start npm -- start这条命令是pm2的万能命令,pm2 start ,就是这一系列命令中的最豪华命令.这个json我们可以理解为一个任务参数描述文件.通 ...

  7. Mysql中使用json格式存储数据好吗?

    在最近的一次项目开发过程中,在数据表设计阶段,对是否用json格式存储某些数据我们产生了分歧.以往项目中对此点比较随意,导致数据表中有些json格式数据体积很大,层次很深,我担心这会降低数据查询和解析 ...

  8. JAVA中返回json格式数据

    1. 返回json格式 package com.demo.util;import com.alibaba.fastjson.JSONObject;import java.util.HashMap; i ...

  9. java curl json_curl javaSSm框架中传入json数组的格式方法

    curl与java结合传入get.post,head请求, 比如: curl的地址: curl -l 127.0.0.1:8080/spacobj/core/do?acid=100 -H " ...

最新文章

  1. 面试官扎心一问:知道 CopyOnWriteArrayList 吗?
  2. 李开复:明年会有一批AI公司倒闭
  3. 构建flutter项目
  4. [渝粤教育] 长沙民政职业技术学院 高职公共英语(一) 参考 资料
  5. Android kernel Crash后,定位出错点的方法
  6. 三星Galaxy Fold 2渲染图曝光:怎么折是个问题
  7. 页面进入和退出的特效
  8. [转] js中的钩子机制(hook)
  9. linux驱动编写(触摸屏驱动)
  10. win10+GTX1070+keras+Anaconda+python3.5安装记录
  11. 【Unity3D读取数据】(三)Xml文件操作(创建、读取、写入、修改)
  12. esp8266教程:网络基础知识
  13. SG90舵机驱动程序
  14. 一套成熟的BPM系统应该有的功能
  15. 怎么获取微信公众号的音频视频
  16. matlab模糊建模设计,毕业设计matlab建模
  17. Azure 上通过 SendGrid 发送邮件
  18. 大学毕业小总结以及感想
  19. java的无参构造方法_Java有参构造方法和无参构造方法
  20. OTG声卡Type-C边充边玩数据线方案

热门文章

  1. Windows的批处理(bat)脚本
  2. 关于微信编辑器,我有话说~~~
  3. 2022-3-25 面试题01.判定字符是否唯一 —— 【裂开】真的没有想到可以用位图
  4. 我的AA字体美化方法【方正圆体字】(转)
  5. 以小见大——那些基于 protobuf 的五花八门的 RPC(2)
  6. RiruEdxposed学习研究(一)手把手安装Edxposed
  7. android 展开菜单,Android之可收缩展开列表ExpandableList
  8. 口腔诊所医院客户关系管理(CRM)系统
  9. 用C语言实现KMP算法,KMP算法 纯C实现
  10. pytest接口测试(二)-- 案例演示(QQ号码测凶吉)