JSON和Jackson的使用
文章目录
前言
以下内容乱写的以提醒自己为主:
JSON,纯文本格式,就是一个字符串
前后端分离时代,后端部署后端,提供接口,提供数据
请求Controller返回的String即可是一个接口
(这里指Controller)
一、JSON与Javascript对象
Javascript对象转为JSON
//编写一个JS对象
var user = {
name = "zhangsan",
age = 20,
sex = "男"
};
var json = JSON.stringify(user);
//这里的json就是一个JSON格式的字符串了
JSON转为Javascript对象
var obj = JSON.parse(json);
//这里就把上面的json转为一个JS对象了
二、Jackson的使用
1.导入Jackson依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.0</version>
</dependency>
2.在Controller中使用
先准备一个实体类User,里面有name和age属性
在Controller中创建一个这个类的对象然后操作它
返回对象JSON
@Controller
public class testController {
/*
@ResponseBody
在Controller类的方法上面加上这个,那么这个返回值String,
将不会走视图解析器,会直接返回一个字符串
*/
@ResponseBody
@RequestMapping("jsontest1")
public String json1(){
//Jackson
ObjectMapper mapper = new ObjectMapper();
//创建User对象
User user = new User("张三",20);
//把这个对象转成JSON字符串格式
String jsontest = mapper.writeValueAsString(user);
return jsontest;
}
}
这样直接在浏览器地址栏访问这个jsontest1得到的就是
这样一个样子,这就说明通过使用这个Jackson,
成功将一个Java对象转成了JSON格式的字符串
返回ArrayList的JSON
那么这里在测试传入一个ArrayList里面放了一堆User试试
@RestController
public class testController {
@RequestMapping(value = "jsontest1")
public String json1() throws JsonProcessingException {
//Jackson
ObjectMapper mapper = new ObjectMapper();
//创建User对象
User user1 = new User("张三",20);
User user2 = new User("张四",20);
User user3 = new User("张五",20);
User user4 = new User("张六",20);
User user5 = new User("张七",20);
List<User> userList = new ArrayList<>();
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
userList.add(user5);
//把这个对象转成JSON字符串格式
String jsontest = mapper.writeValueAsString(userList);
return jsontest;
}
}
发现返回回来是这么个数组,也是可以的
返回时间JSON
这里也可以把时间转一下,那么返回来是一个时间戳timestamp
@RequestMapping(value = "jsontest2")
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(new Date());
}
这样返回回来是这么一串,刷新就会变…
3.JSON字符串转Java对象
在JS代码中,将JSON对象转为JSON字符串后,传向后端,后端将JSON字符串转为Java对象
ObjectMapper mapper = new ObjectMapper();
Books books = mapper.readValue(ubook,Books.class);
这里是把这个JSON字符串转为Books对象
4.处理JSON字符串乱码问题
第一种方式
在@RequestMapping参数中添加produces属性,
如下
@RequestMapping(value = "jsontest1" ,
produces = "application/json;charset=utf-8")
当然,这种方法比较少使用,因为每一个都要加这么一串,
第二种方式
统一配置的方法就是在SpringMVC配置文件中加上这么一大块代码,这样所有的JSON乱码问题都解决了
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
总结
所以要使用Jackson把Java对象转成JSON格式然后传给前端的方法总结如下:
第一步,把Jackson的包导入
第二步,在SpringMVC配置文件中把乱码统一配置解决
第三步,新建一个ObjectMapper对象,然后用这个对象的writeValueAsString方法把Java对象转为JSON即可。
注意:上面的注解要加一个@ResposeBody让返回值String不再是一个试图而是一个字符串。
补充
@RestController
如果在控制器Controller中把那个类上面的@Controller换成@RestController,那么这个类下面的所有方法将都不再通过视图解析器,直接返回一个字符串,也就是JSON格式的字符串,也就是一个接口数据。据说与前后端分离都这么干。
如果用了这个注解,那么刚刚那个@ResponseBody就没啥用可以不写了。
结语
这里说一下,这个是我发的第一篇博客,我还是一个超级萌新小白,刚刚学完SSM,还是那种图速度不图质量的那种,学的懵懵懂懂,模模糊糊,转头就忘,记住也不怎么扎实,上面的内容里的术语肯定错的一堆,如果有幸有人看的话,请原谅以下哈哈哈。
这里写这样的博客主要是督促自己,因为之前学的太草了,好多东西不扎实,没完全弄懂,所以写这样的博客就会很认真,督促自己认真,也不容易忘印象深一些,忘了也能看,所以如果有大佬能指点以下我的错误,这里万分感谢!