Ajax异步访问数据需要前端(js)和服务器端(java)进行传输数据,但是Ajax只能识别字符串,但是服务器里面的是一个java对象,需要将java对象转换为字符串(使用json ),Gson与Fastjson就是将java对象转换json串的主流工具类!
二、服务器端java对象转化json串 1、Ajax异步传递数据为什么使用json?1. 本质就是一个字符串 2. java和js都支持json形式字符串 所以我们需要将java对象转换为json串,在前端将json串转化为js对象2、常用的json形式数据转换工具(服务器端java转json)
Gson(google的),**Fastjson(阿里的)转换工具** ,我们目前主要使用**Fastjson**3、Google的Gson
Gson是目前功能最全的Json解析神器,Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器 。Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
4、阿里巴巴的Fastjson (主流 )Fastjson是一个Java语言编写 的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致 ,超过所有json库。
(注:maven选择依赖小攻略:搜索maven,选择使用人数最高的一般都是用于企业开发使用的)
2、创建实体类Usercom.alibaba fastjson 1.2.47
public class User {
private Integer id;
private String name;
private String password;
private Date birthday;
3、使用FastJson工具类转换对象
(1)单个java对象转换为JSON串
@Test
public void FastJson() {
//1.创建一个对象
User user = new User(1, "王恒杰", "123456", new Date());
// 打印对象
System.out.println("User对象"+user);
String json = JSONObject.toJSONString(user);
System.out.println("json串"+json);
}
- 转换后结果
注:我们会发现对象转换为JSON串时,日期转化不会正常显示 ,他会显示为毫秒!FastJson专门提供一个API解决日期格式转化 问题!
(2)java对象转换为JSON串日期转化方案
@Test
public void FastJson() {
//1.创建一个对象
User user = new User(1, "王恒杰", "123456", new Date());
// 打印对象
System.out.println("User对象"+user);
String json1 = JSONObject.toJSONString(user);
System.out.println("json串"+json1);
String json2 = JSONObject.toJSONStringWithDateFormat(user, "yyyy-mm-dd hh:mm:ss");
System.out.println("日期格式化后的json串"+json2);
}
- 转换后结果
@Test
public void ListByFastJsonTest(){
//1.创建List集合
ArrayList list = new ArrayList<>();
//2,添加数据
list.add(new User(1, "王恒杰1", "123456", new Date()));
list.add(new User(2, "王恒杰2", "123456", new Date()));
list.add(new User(3, "王恒杰3", "123456", new Date()));
list.add(new User(4, "王恒杰4", "123456", new Date()));
//通过fastJson将List集合转换为json串
String listUser = JSONObject.toJSONStringWithDateFormat(list, "yyyy-mm-dd");
System.out.println(listUser);
}
- 转换后结果
@Test
public void MapByFastJsonTest() {
//1.创建map集合
Map map = new HashMap<>();
//2,添加数据
map.put("1号选手", "王恒杰1");
map.put("2号选手", "王恒杰2");
map.put("3号选手", "王恒杰3");
map.put("4号选手", "王恒杰4");
//通过fastJson将map集合转换为json串
String json = JSONObject.toJSONString(map);
System.out.println(json);
}
- 转换后结果
- 实体类User:
- 测试方法:
@Test
public void DateByFastJsonTest(){
User user = new User();
user.setBirthday(new Date());
String json = JSONObject.toJSONString(user);
System.out.println(json);
}
- 转换后结果
先对与fastJson来说:Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。因为我很少使用,所以Gson我就测试了一个!
1、在maven项目中导入Fastjson 的依赖2、创建实体类Usercom.google.code.gson gson 2.8.5
public class User {
private Integer id;
private String name;
private String password;
private Date birthday;
3、单个java对象转换为JSON串:toJson
@Test
public void Gson() {
//1.创建一个对象
User user = new User(1, "王恒杰", "123456", new Date());
// 打印对象
System.out.println("User对象" + user);
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json);
}
- 转换后结果
@Test
public void DateGson() {
//1.创建一个对象
User user = new User(1, "王恒杰", "123456", new Date());
// 打印对象
System.out.println("User对象" + user);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.setDateFormat("yyyy-mm-dd").create();
String json = gson.toJson(user);
System.out.println(json);
}
- 转换后结果
在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,
如果只是功能 要求,没有性能 要求,可以使用google的Gson,
如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean
//json形式字符串:xhr.responseText
1. 转换方式1: var JsJsonObject=JSON.parse(xhr.responseText);
2. 转换方式2: var JsJsonObject=eval("+(xhr.responseText)+");
JSJsonObject属性名 获取对应属性值
- 前后端json转化总结:
1. java对象:使用json转换工具(FastJson) 将对象转换为json串 再进行转换 2. js: 将接收到的json字符串转换为js中的json对象七、FastJson实用案例 1、案例要求:单击展示单个用户信息 & 验证用户名是否存在 2、具体实现 (1)技术选型:
Servlet+html+Ajax+js(主要展示ajax&FastJson效果),Ajax我们使用的是原生js实现(2)所需要依赖
javax.servlet
javax.servlet-api
3.1.0
provided
javax.servlet.jsp
jsp-api
2.1
com.alibaba
fastjson
1.2.47
(3)实体类User
public class User {
private Integer id;
private String name;
private String password;
private Date birthday;
(3)html
用户名:(4)ajax实现数据传输
(5)servlet实现后端
- 单击展示单个用户信息
@WebServlet("/checkName")
public class CheckServlet extends HttpServlet {
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//统一编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;setchar=utf-8");
response.setCharacterEncoding("utf-8");
//接收数据
String name = request.getParameter("name");
User user = new User(1, "王恒杰", "123456", new Date());
//处理业务
if (user.getName().equals(name)) {
response.getWriter().print("用户可以被查询到!");
} else {
//验证用户名是否存在
response.getWriter().print("用户不存在");
}
}
}
- 验证用户名是否存在
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//统一编码格式
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;setchar=utf-8");
response.setCharacterEncoding("utf-8");
//接收数据
String name = request.getParameter("name");
User user = new User(1, "王恒杰", "123456", new Date());
//处理业务
// 响应输出流 向客户端响应内容
String jsonUser = JSONObject.toJSonStringWithDateFormat(user, "yyyy-mm-dd");
response.getWriter().print(jsonUser);
}
}
效果展示:



