1、基本简介
-
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
-
采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
-
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
-
数据交换格式不止json一种,只不过json是使用最广泛地;另外还有xml、yaml、bson…
总之JSON就是一种轻量级的前后端交互数据的格式,仅此而已!
2、前端JSON使用
JavaScript语言中一切都是对象,任何类型的数据都能转化为JSON格式:字符串、数字、数组、对象…JS中提供了JSON对象以及两个重要的方法用于转化、解析json格式的数据!
2.1、基本数据转换
使用JSON.stringify()方法转化为json格式、JSON.parse()解析一个JSON格式的数据为JS对象。
console.log("===============JS对象转JSON==================")
var str = "字符串";
var str_json = JSON.stringify(str);
console.log(str);
console.log(str_json);
var arr = [5,"123","str","你好",98];
var arr_json = JSON.stringify(arr);
console.log(arr);
console.log(arr_json);
console.log("===============JSON转JS对象==================")
var json1 = JSON.parse('[5,"123","str","你好",98]');
var json2 = JSON.parse('"字符串"');
console.log(json1);
console.log(json2);
2.2、对象类型
var person = {
name: "xiaoming",
age: 22,
sex: "男"
};
//对象转化为JSON数据格式
var person_json = JSON.stringify(person);
console.log(person)
console.log(person_json)
console.log("==========================================")
var user = {
name: "xiaohong",
age: 22,
sex: "女"
};
var arr = [person, user];
var arr_json = JSON.stringify(arr);
console.log(arr)
console.log(arr_json)
console.log("==========================================")
//JSON数据格式转化为对象 parse解析方法
var now = JSON.parse('{"name":"xiaoli","age":22,"sex":"男"}');
console.log(now)
-
JS对象与JSON格式是不同的,虽然二者都是Key :Value格式,但是JSON中key需要" "包裹,只需要知道JSON格式本质是一个字符串即可!
-
多个key:value键值对之间使用逗号隔开
-
对象中的属性用花括号{}包括
-
数组用方括号[]包括多个对象!JS中一切都是对象!
3、Jackson简单使用
先引入jackson的依赖,如果在运行时出现异常需要将tomcat的lib下也加入jackson的包或者在项目打包lib中加入。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
3.1、给前端响应一个字符串
@RequestMapping(value = "/j1", produces = "text/*")
@ResponseBody //直接响应页面主体,不走视图解析器
public String test1(){
User user = new User("薯条", 21, "汉子");
return user.toString();
}
3.2、pojo转为json字符串
@RequestMapping(value = "/j2", produces = "application/json;charset=utf-8")
@ResponseBody
public String test2() throws JsonProcessingException {
User user = new User("薯条", 21, "汉子");
ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(user);
return str;
}
3.3、集合容器转json字符串
基本上所有的集合框架容器都能解析!
@RequestMapping(value = "/j3", produces = "application/json;charset=utf-8")
@ResponseBody
public String test3() throws JsonProcessingException {
User user1 = new User("薯条", 21, "汉子");
User user2 = new User("汉堡", 21, "汉子");
User user3 = new User("奶茶", 21, "汉子");
List<User> list = new ArrayList<>();
list.add(user1);list.add(user2);list.add(user3);
ObjectMapper objectMapper = new ObjectMapper();
String str = objectMapper.writeValueAsString(list);
return str;
}
3.4、日期对象
转为日期对象比较麻烦,Date对象交给ObjectMapper处理之前需要进行一下转化,否则转为Json后前端收到的是一个时间戳,那就需要再次转换了。
-
第一种:SimpleDateFormat对象将日期格式化,然后将格式化的对象转为json字符串;注意格式化日期大小写字母!
-
第二种:关闭ObjectMapper将日期转为时间戳再转json字符串,在设置一下ObjectMapper的时间格式。
@RequestMapping(value = "/j4", produces = "application/json;charset=utf-8")
@ResponseBody
public String test4() throws JsonProcessingException {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //设置时间格式
ObjectMapper objectMapper = new ObjectMapper();
// objectMapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); //关闭转化时间戳
// objectMapper.setDateFormat(sdf); //设置时间格式
// String str = objectMapper.writeValueAsString(date); //转化json字符串
String str = objectMapper.writeValueAsString(sdf.format(date)); //直接跳过objectMapper的设置
return str;
}
4、乱码问题
乱码问题的原因是因为直接响应并没有走视图解析器、也不走过滤器,因此需要设置编码。可以在每个方法的RequestMapping中加入produces配置响应内容的格式与编码,也可以直接在springmvc配置文件中加入。
<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="failOnUnknownProperties" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>