文章目录
一、JSON 概述
JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式。与 XML 一样,JSON 也是基于纯文本的数据格式。
1.对象结构
- 对象结构以“{”开始、以“}”结束。
- key:value对构成
- 其中,key 必须为 String 类型,value 可以是 String、Number、Object、Array 等数据类型。
{
"pname":"张三",
"password":"123456",
"page":40
}
2.数组结构
- 数组结构以“[”开始、以“]”结束。
{
"sno":"201802228888",
"sname":"张三",
"hobby":["篮球","足球"],
"college":{
"cname":"清华大学",
"city":"北京"
}
}
二、JSON 数据转换
1.与JavaScript互传
<script type="text/javascript">
var user = {
name:"高朗",
age:18,
sex:"男"
};
//将js对象转换为json对象
var json = JSON.stringify(user);
//将JSON对象转换为JavaScript对象
var user2 = JSON.parse(json);
</script>
2.json解析工具
(1)JSON乱码问题
-
方法一:
方法名前加注解:@RequestMapping(value = "/json",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>
(2)不会走视图解析器,会直接返回一个字符串
不需要定义一个jsp页面,直接在页面上显示返回的字符串
-
方式一:
在需要的方法名上加上注解@ResponseBody
-
方式二:
如果controller类的所有方法都不需要走视图解析器,直接返回一个字符串在页面的话。
直接把controller类上的@Controller
注解改成@RestController
(3)Jackson解析工具
步骤:
- 导入jar包依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
- JSON乱码问题配置
- 使用
-
主要是导入jar包中ObjectMapper类的使用。
-
ObjectMapper.writeValueAsString(Object object)方法的作用是将传入的对象序列化为json字符串,返回给调用者。
-
传入对象结构
@RequestMapping("/json")
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
public String json() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
User user = new User(1001,"高朗",18);
String str = mapper.writeValueAsString(user);
return str;
}
- 传入List集合对象
@RequestMapping("/json2")
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
public String json2() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
List<User> userList = new ArrayList<>();
User user = new User(1001,"高朗",18);
User user2 = new User(1001,"晓军",28);
User user3 = new User(1001,"李红",20);
User user4 = new User(1001,"张明",22);
userList.add(user);
userList.add(user2);
userList.add(user3);
userList.add(user4);
return mapper.writeValueAsString(userList);
}
- 传入时间对象
@RequestMapping("/json3")
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
public String json3() 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));
}
如果不自定义日期格式的话输出的是1970年1月1日到现在的毫秒数,Jackson默认是会把时间转成timestamps形式。
解决方式:
方式一:
自定义日期格式
方式二:
取消timestamps形式,自定义时间格式
@RequestMapping("/json3")
@ResponseBody //它就不会走视图解析器,会直接返回一个字符串
public String json3() 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);
}
(4)Fastjson解析工具
- 提供服务器端、安卓客户端两种解析工具,性能表现较好。
- 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
- 允许转换预先存在的无法修改的对象(只有class、无源代码)。
- Java泛型的广泛支持。
- 允许对象的自定义表示、允许自定义序列化类。
- 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
- 导入jar包依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
- 使用
静态方法较多,可以直接调用,主要有以下方法常用
- JSON.toJSONString(Object object):Java对象转JSON字符串
- JSON.parseObject(String json,XXX.class):JSON字符串转Java对象