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

简介: 如今的前端JSON已无处不在,如何在Scalatra中使用json响应数据给前端呢,尽管官方只是介绍了一下json4s,其实仍然需要注意其中的一些细节

先看一个最简单的例子,假如我有这样一个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 https://scalatra.org//guides/2.7/formats/json.html

官网建议我们使用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包,没有引入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
    ``` scala
    import org.json4s.JsonDSL._

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

得到
``` json
{"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

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

目录
相关文章
|
1月前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
42 3
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
JSON Java 数据格式
springboot中表字段映射中设置JSON格式字段映射
springboot中表字段映射中设置JSON格式字段映射
119 1
|
1月前
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
|
1月前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
2月前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
129 2
|
2月前
|
JSON API 数据格式
商品详情数据JSON格式示例参考(api接口)
JSON数据格式的商品详情数据通常包含商品的多个层级信息,以下是一个综合多个来源信息的JSON数据格式的商品详情数据示例参考:
|
2月前
|
机器学习/深度学习 JSON JavaScript
LangChain-21 Text Splitters 内容切分器 支持多种格式 HTML JSON md Code(JS/Py/TS/etc) 进行切分并输出 方便将数据进行结构化后检索
LangChain-21 Text Splitters 内容切分器 支持多种格式 HTML JSON md Code(JS/Py/TS/etc) 进行切分并输出 方便将数据进行结构化后检索
38 0
|
2月前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
516 0
|
3月前
|
JSON 数据格式 Python
6-1|Python如何将json转化为字符串写到文件内 还保留json格式
6-1|Python如何将json转化为字符串写到文件内 还保留json格式