json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
我们这此主要是讲一些他们之间的存方式。
jackson的使用
Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较低级,使用本文介绍的Jackson等高级类库处理起来会方便很多。
首先是我们需要先进行导入jar
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
然后按照个是配置好文件。
这是web.xml这里要注意映射路径要写/而不是/*这样会报404错误
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- springmvc 配置dispatcherServlet 前端控制器 -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置dispatcherServlet要绑定的spring文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 启动优先级 1是最大的-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 这里的映射路径使用的/ 不能通过.jsp-->
<!-- /*是可以同过.jsp页面的-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="aw.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceView>>">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
User类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
测试类,这里重点是注意一下他不走视图解析器。
//@RestController 整个类下面的所有 方法都不走视图解析器
@Controller
public class C1 {
@RequestMapping(value = "/js")
@ResponseBody //这个方法不走视图解析器 直接返回值
public String js1(Model model) throws JsonProcessingException {
//这是jackson中带的类
ObjectMapper objectMapper = new ObjectMapper();
User user = new User(1, "阿威", "asda");
//将对象或值转换成字符串
String s = objectMapper.writeValueAsString(user);
return s;
}
如果有乱码,我们有两种处理方式。
一 直接在RequestMapping中添加produces
@RequestMapping(value = "/js",produces = "application/json;charset=utf-8")
二也是spring中带的,我们在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>
集合转换
@RequestMapping(value = "/js2")
@ResponseBody
public String js2(Model model) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
ArrayList<User> arrayList = new ArrayList<>();
User user = new User(1, "阿威", "asda");
User user2 = new User(1, "阿威", "asda");
User user3= new User(1, "阿威", "asda");
User user4= new User(1, "阿威", "asda");
User user5 = new User(1, "阿威", "asda");
arrayList.add(user);
arrayList.add(user2);
arrayList.add(user3);
arrayList.add(user4);
arrayList.add(user5);
String s = objectMapper.writeValueAsString(arrayList);
return s;
}
重点是看他的显示格式
时间类型
这里我们写类一个工具类,我们要注意方法之间的重载关系,很源码的底层都是这样的格式,他们不会经常其方法名,他们都是通过这种方法名重载进行的。我要重点学习一下他的这样的思想。
package aw.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JsonUtils {
public static String getDate(Object object) throws JsonProcessingException {
return getDate(object,"yyyy-MM-dd HH:mm:ss");
}
public static String getDate(Object object,String s) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
//这是spring 自带的关闭时间戳
objectMapper.configure(SerializationFeature.CLOSE_CLOSEABLE,false);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(s);
// String format = simpleDateFormat.format(object); 这种是java原生的
objectMapper.setDateFormat(simpleDateFormat);
return objectMapper.writeValueAsString(object);
}
}
我们在使用的时候就只需要传递对象
@RequestMapping(value = "/js3")
@ResponseBody
public String js3(Model model) throws JsonProcessingException {
Date date = new Date();
String s="yyyy-MM-dd HH:mm:ss";
return JsonUtils.getDate(date,s);
}
fastjson
他是阿里家开发的
Fastjson 特性
提供服务器端、安卓客户端两种解析工具,性能表现较好。
提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
允许转换预先存在的无法修改的对象(只有class、无源代码)。
Java泛型的广泛支持。
允许对象的自定义表示、允许自定义序列化类。
支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)
@RequestMapping(value = "/js4")
@ResponseBody
public String js4(Model model) throws JsonProcessingException {
User user = new User(1, "阿威", "asda");
//java对象转换成json
String s = JSON.toJSONString(user);
return s;
}
我们这里只需要掌握一种转换方式就行,其他的作为了解,不懂时候直接百度。