Java中关于json的几个细节
在spring中访问一个接口,如果要得到一个json返回值,需要两个前提条件:
1.注解声明,要使用json格式进行返回:(两种方式)
①使用@ResponseBody
②使用@RestController
2.相关jar包:(常用的两种)
①json-lib
@jackson-core-asl
Json-lib依赖commons系列的包及 ezmorph包共 5个,而Jackson除自身的以外只依赖于commons-logging
我平常使用的JSONObject 和 JSONArray这两个对象和相应方法都是json-lib中的,这个jar是个老牌jar包,可用,但是有缺陷,速度上远远不如jackson,而且数据的处理也干净
比如:对时间的处理
public JSONObject getQrcodeBackgroundNew(HttpServletRequest request){ JSONObject json = new JSONObject(); try { Date date = new Date(); json.put("date", date); } catch (Exception e) { log.error(e.getMessage(),e); } return json; }
返回值:
{ "date": { "date": 10, "day": 2, "hours": 10, "minutes": 14, "month": 3, "seconds": 36, "time": 1523326476676, "timezoneOffset": -480, "year": 118 } }
可以看到数据的处理是非常繁琐的
而如果使用jackson:
@RequestMapping("/getQrcodeBackgroundNew")
public Map<String, Object> getQrcodeBackgroundNew(HttpServletRequest request){
Map<String, Object> json = new HashMap<>();
try {
Date date = new Date();
json.put("date", date);
} catch (Exception e) {
log.error(e.getMessage(),e);
}
return json;
}
返回值:
{
"date": 1523330326860
}
需要注意的是,我们在写接口时,尽量不要返回前端value为null的key,比如这种情况:
public class User {
private String name;
private String title;
private int age;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
@RestController
public class DemoController {
@RequestMapping("/getUser")
public User getUser(){
User u = new User();
u.setName("2009");
return u;
}
}
此时访问,返回值如下:
{
"name": "伍声2009",
"title": null,
"age": 0
}
如果不想和前端打起来,最好把这一块处理好,如果使用jackson,需要导入和jackson相关的几个包
jackson2.*后导包;
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.8.7</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.7</version> </dependency>
然后在实体类User上使用@JsonInclude(JsonInclude.Include.NON_NULL)配置
这样,经过处理的返回值就不会过滤value为null的数据
{
"name": "伍声2009",
"age": 0
}

浙公网安备 33010602011771号