9. JSON
9.1 简介
JSON(JavaScript Object Notation,JS 对象标记)是一种轻量级数据交换格式,采用独立于编程语言的文本格式储存和表示数据,易于机器解析和生成,提升网络传输效率。
任何 JavaScript 支持的数据类型都可以通过 JSON 表示,例如字符串、数字、对象、数组等。
JSON 键值对保存 JavaScript 对象,键:值
对组合中的键名在前用双引号 ""
包裹,值在后,两者使用冒号 :
分隔。
{"name": "弗罗多"}
{"age": "50"}
{"sex": "男"}
-
JSON 是 JavaScript 对象的字符串表示法,使用文本表示一个 JS 对象,本质是一个字符串。
var obj = {a: 'Hello', "b": 'World'}; // JS 对象 var json = '{"a": "Hello", "b": "World"}'; // JSON 字符串
-
使用 JSON.stringify() 方法可将 JavaScript 对象转换为JSON字符串。
var json = JSON.stringify({a: 'Hello', b: 'World'}); // json = '{"a": "Hello", "b": "World"}'
-
使用 JSON.parse() 方法可将 JSON 字符串转换为 JS 对象。
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); // obj = {a: 'Hello', b: 'World'}
9.2 Controller 返回 JSON
(1) jackson
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.10.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.0</version>
</dependency>
注意:新导入依赖时发布的lib目录下引入依赖
(2) 中文乱码
@RequestMapping
注解produces
属性解决中文乱码
@Controller
public class UserController {
// produces 设置编码格式,解决中文乱码
@RequestMapping(value = "/testResJson", produces = "application/json;charset=utf-8")
// 不被视图解析器解析,返回JSON字符串
@ResponseBody
public String testResJson() throws JsonProcessingException {
User user = new User("弗罗多", 50, "男");
ObjectMapper mapper = new ObjectMapper();
// 将对象转换为 JSON
return mapper.writeValueAsString(user);
}
}
- Spring MVC 配置解决中文乱码问题
<!--spring-servlet.xml-->
<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>
- 测试
@Controller
public class UserController {
// produces 设置编码格式,解决乱码
@RequestMapping(value = "/testResJson")
// 不被视图解析器解析,返回字符串
@ResponseBody
public String testResJson() throws JsonProcessingException {
User user = new User("弗罗多", 50, "男");
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(user);
}
@RequestMapping(value = "/testResMoreJson")
@ResponseBody
public String testResMoreJson() throws JsonProcessingException {
List<User> userList = new ArrayList<User>();
User frodo = new User("弗罗多", 50, "男");
User sam = new User("山姆", 50, "男");
User aragon = new User("阿拉贡", 50, "男");
userList.add(frodo);
userList.add(sam);
userList.add(aragon);
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(userList);
}
@RequestMapping("/testResTimeJson")
@ResponseBody
public String testResTimeJson() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//不使用时间戳的方式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//自定义日期格式对象
SimpleDateFormat simpleDate = new SimpleDateFormat("yyyy-MM-dd HH:dd:ss");
//指定日期格式
mapper.setDateFormat(simpleDate);
Date date = new Date();
// java 时间格式控制
// String formatDate = simpleDate.format(date);
return mapper.writeValueAsString(date);
}
}
- 抽取为工具类
public class JsonUtil {
public static String getJson(Object object) {
return getJson(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getJson(Object object,String dateFormat) {
ObjectMapper mapper = new ObjectMapper();
//不使用时间差的方式
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//自定义日期格式对象
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
//指定日期格式
mapper.setDateFormat(sdf);
try {
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
}
(3) FastJson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
@RequestMapping(value = "/testFastJson")
@ResponseBody
public String testFastJson() throws JsonProcessingException {
List<User> userList = new ArrayList<User>();
User frodo = new User("弗罗多", 50, "男");
User sam = new User("山姆", 50, "男");
User aragon = new User("阿拉贡", 50, "男");
userList.add(frodo);
userList.add(sam);
userList.add(aragon);
System.out.println("*******Java对象 转 JSON字符串*******");
String str1 = JSON.toJSONString(userList);
System.out.println("JSON.toJSONString(list)==>"+str1);
String str2 = JSON.toJSONString(frodo);
System.out.println("JSON.toJSONString(frodo)==>"+str2);
System.out.println("\n****** JSON字符串 转 Java对象*******");
User jp_user1=JSON.parseObject(str2,User.class);
System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1);
System.out.println("\n****** Java对象 转 JSON对象 ******");
JSONObject jsonObject1 = (JSONObject) JSON.toJSON(sam);
System.out.println("(JSONObject) JSON.toJSON(sam)==>"+jsonObject1.getString("name"));
System.out.println("\n****** JSON对象 转 Java对象 ******");
User to_java_user = JSON.toJavaObject(jsonObject1, User.class);
System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user);
return JSON.toJSONString(userList);
}