JSON(JavaScript Object Notation) 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。JSON 主要用于数据在前后端的传输,后端将JavaBean对象转化为Json字符串,前端将Json字符串转化为JS对象,尤其应用于AJAX异步请求。
前端JSON工具由JS自带
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>json</title>
</head>
<body>
<script type="text/javascript">
//编写一个js的对象
let person = {
name: "小红",
age: 2,
sex: "男"
};
//将js对象转换成json字符串
let json_str = JSON.stringify(person);
//将json字符串转换为js对象
let js_str = JSON.parse(json_str);
</script>
</body>
</html>
后端也需要解析工具,Jackson和fastjson是主流工具。
Jackson
maven依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
创建pojo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String name;
private int age;
private String sex;
}
编写Controller返回给前端一个Json字符串
/*
@RestController
方法不通过视图解析器,而是直接传递数据
通常用于前后端分离的数据传输
还有另一种方式时
@Controller和@Response的组合实现同样的效果
*/
@RestController
public class HelloJsonController {
@RequestMapping("/json")
public String json() throws JsonProcessingException {
//创建Jackson对象映射器,解析数据
ObjectMapper mapper = new ObjectMapper();
//创建实体对象
List<User> users = new LinkedList<User>();
users.add(new User("小红", 20, "女"));
users.add(new User("小马", 10, "男"));
//利用对象映射器解析实体对象
String json_str = mapper.writeValueAsString(users);
return json_str;
}
}
解决json字符串的乱码问题
@RequestMaping的produces属性来实现,修改下代码
//produces:指定响应体返回类型和编码
@RequestMapping(value = “/json”,produces =“application/json;charset=utf-8”)
在springmvc的配置文件上添加StringHttpMessageConverter消息转换配置!
<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>
fastjson
maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
fastjson中除了常规的Json字符串和JavaBean对象
还存在Json对象(JSONObject)和Json数组(JSONArray)
看源码可以知道,JSONObject是一个Map,JSONArray是一个list
@Test
public void json() throws JsonProcessingException {
//创建实体对象
List<User> users = new LinkedList<User>();
users.add(new User("小红", 20, "女"));
users.add(new User("小马", 10, "男"));
//Javabean转Json字符串
String str1 = JSON.toJSONString(users);
String str2 = JSON.toJSONString(new User("小红", 20, "女"));
//Json字符串转JavaBean
List<User> list = JSON.parseArray(str1, User.class);
User user = JSON.parseObject(str2, User.class);
//JavaBean转Json对象
JSONObject jsonObject = (JSONObject) JSON.toJSON(user);
JSONArray jsonArray = (JSONArray) JSON.toJSON(list);
//Json对象转JavaBean
user = JSON.toJavaObject(jsonObject, User.class);
}