SpringMVC-08-JSON
概述
JSON(JavaScript Object Notaion,JS对象标记)是一种轻量级的数据交互格式,目前使用特别广泛
采用完全独立于编程语言的文本格式来存储和表示数据
简洁和清晰的层次结构使得JSON成为理想的数据交互语言(在前后端分离时代,尤为突出)
易于人阅读和编写,同时也易于机器解析和生成,并可以有效地提升网络传输效率
JavaScript对象和JSON的区别
var obj = {a:'Hello',b:'world'};//这是一个对象,键名也可以使用引号包裹
var json='{"a":"Hello","b":"world"}';//这是一个JSON字符串,本质是一个字符串
JavaScript对象和JSON的互相转换
<script>
//编写一个js对象
var user={
id:1,
name:"void",
age:18
}
console.log(user);
//将js对象转成json对象
var json = JSON.stringify(user);
console.log(json);
//将json对象---->js对象
var obj = JSON.parse(json);
console.log("----------------------")
console.log(obj);
</script>
Controller返回JSON数据
常用的工具
- Jackson
- 阿里的fastjson
- 自己写
Jackson
导入依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.1</version>
</dependency>
配置必要的web.xml,springmvc-servlet.xml
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private int age;
}
补充:如何让controller只返回字符串,而不走视图解析器?
@RequestMapping("/j1")
@ResponseBody
//or
@RestController
测试
@Controller
public class UserController {
@RequestMapping("/j1")
@ResponseBody //不走视图解析器的注解,会直接返回字符串 @RestController 替换这两个注释也能达成一样的效果
public String json01() throws JsonProcessingException {
//Jackson ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user = new User(1, "通天塔", 18);
String str = mapper.writeValueAsString(user);
return str;
}
}
发现存在乱码问题
json乱码解决方法一
@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")
json乱码解决方法二
上一种方法不免繁琐,每个路径映射都要添加
更好的解决方案:在springmvc-servlet.xml添加配置
<!-- 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将集合转JSON字符串
@RequestMapping("/j2")
public String json02() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
ArrayList<User> users = new ArrayList<User>();
User user1 = new User(1, "明天01", 18);
User user2 = new User(2, "明天02", 18);
User user3 = new User(3, "明天03", 18);
User user4 = new User(4, "明天04", 18);
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
String str = mapper.writeValueAsString(users);
return str;
}
Jackson对日期进行处理
法一:
@RequestMapping("/j3")
public String json03() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return mapper.writeValueAsString(sdf.format(date));
}
法二:
@RequestMapping("/j4")
public String json04() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//不使用用时间戳
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
mapper.setDateFormat(sdf);
Date date = new Date();
return mapper.writeValueAsString(date);
}
抽象工具类
public class JSONUtils {
public static String getJSON(Object object){
return getJSON(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getJSON(Object object,String sdf){
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sdf);
mapper.setDateFormat(simpleDateFormat);
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
FastJson
fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现
json对象和JavaBean对象的转换
实现JavaBean对象和json字符串的转换
实现json对象和json字符串的转换
依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.61</version>
</dependency>
测试
@RequestMapping("/j5")
public String json05(){
ArrayList<User> users = new ArrayList<User>();
User user1 = new User(1, "明天01", 18);
User user2 = new User(2, "明天02", 18);
User user3 = new User(3, "明天03", 18);
User user4 = new User(4, "明天04", 18);
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
//Java对象转JSON字符串
String str1 = JSON.toJSONString(users);
System.out.println("Java对象转JSON字符串:"+str1);
//JSON字符串转Java对象
String str2 = JSON.toJSONString(user1);
User user = JSON.parseObject(str2,User.class);
System.out.println("JSON字符串转Java对象:"+user);
//Java对象转JSON对象
JSONObject jo = (JSONObject) JSON.toJSON(user2);
System.out.println("Java对象转JSON对象:"+jo.getString("id"));
//JSON对象转Java对象
User user5 = JSON.toJavaObject(jo, User.class);
System.out.println("JSON对象转Java对象:"+user5);
return "fastjsontest";
}
out
Java对象转JSON字符串:[{"age":18,"id":1,"name":"明天01"},{"age":18,"id":2,"name":"明天02"},{"age":18,"id":3,"name":"明天03"},{"age":18,"id":4,"name":"明天04"}]
JSON字符串转Java对象:User(id=1, name=明天01, age=18)
Java对象转JSON对象:2
JSON对象转Java对象:User(id=2, name=明天02, age=18)