JSON即JavaScript Object Notation(JavaScript对象表示法),现在常被作为不同程序之间通信的语言。算是机器之间交流的语法规则的一种,对于程序员来讲掌握JSON的解析变得非常重要,这将有助于我们和程序之间的沟通。
一个简单的JSON案例如下:
{ "name":"小王同学", "age":18, "pengyou":["张三","李四","王二","麻子",{ "name":"野马老师", "info":"像匹野马一样狂奔在技术钻研的道路上" }], "heihei":{ "name":"大长刀", "length":"40m" } }
下面介绍三种常用的解析方法:
1 Gson
将对象转换为JSON字符串
1. 引入JAR包
2. 在需要转换JSON字符串的位置编写如下代码即可:
String json = new Gson().toJSON(要转换的对象);
将JSON字符串转换为对象
1. 引入JAR包
2. 在需要转换Java对象的位置, 编写如下代码
对象 = new Gson().fromJson(JSON字符串,对象类型.class);
案例Demo:
public class Demo1 { public static void main(String[] args) { // 创建json对象 Gson gson = new Gson(); // 转换成json {"id":"100","name":"金苹果","info":"种植苹果"} Book book = new Book("100", "金苹果", "种植苹果"); String s = gson.toJson(book); System.out.println(s); // json转字符串 Book book1 = gson.fromJson(s, Book.class); System.out.println(book1); } }
public static void main(String[] args) { // 创建json对象 Gson gson = new Gson(); // json转字符串 {"id":"100","name":"金苹果","info":"种植苹果","page":["锄禾日当午","汗滴禾下土"]} HashMap data = gson.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种植苹果\",\"page\":[\"锄禾日当午\",\"汗滴禾下土\"]}", HashMap.class); System.out.println(data.get("page")); // json中的数组会被转成List集合 System.out.println(data.get("page").getClass()); List page = (List) data.get("page"); System.out.println(page.get(1)); }
2 FastJson
将对象转换为JSON字符串
转换JSON字符串的步骤:
1. 引入JAR包
2. 在需要转换JSON字符串的位置编写如下代码即可
将JSON字符串转换为对象
1. 引入JAR包
2. 在需要转换Java对象的位置, 编写如下代码:
类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
List<类型> list=JSON.parseArray(JSON字符串,类型.class);
案例Demo:
public static void main(String[] args) { Book book = new Book("1002", "唐诗300首","床前明月光"); // 转换 {"id":"1002","info":"床前明月光","name":"唐诗300首"} String json = JSON.toJSONString(book); System.out.println(json); // json转对象 Book book1 = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光\",\"name\":\"唐诗300首\"}", Book.class); System.out.println(book1.getName()); }
public static void main(String[] args) { // json转数组 ["一二三", "二三四", "三四五"] List<String> strings = JSON.parseArray("[\"一二三\", \"二三四\", \"三四五\"]", String.class); System.out.println(strings.get(2)); }
3 Jackson
将JSON字符串转换为对象
步骤:
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
readValue(json字符串数据,Class)
@Test public void tes5() throws Exception { String json = "{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}"; ObjectMapper mapper = new ObjectMapper(); Person person = mapper.readValue(json, Person.class); System.out.println(person);// 输出Person类的toString() }
Java对象转换JSON
1. 导入jackson的相关jar包
2. 创建Jackson核心对象 ObjectMapper
3. 调用ObjectMapper的相关方法进行转换
writeValue(参数1,obj):
参数1:
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
writeValueAsString(obj):将对象转为json字符串
Person p = new Person(); p.setName("张三"); p.setAge(23); p.setGender("男"); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); //writeValue,将数据写到d://a.txt文件中 mapper.writeValue(new File("d://a.txt"), p); //writeValue,将数据关联到Writer中 mapper.writeValue(new FileWriter("d://b.txt"),p);
案例:校验用户名是否存在
服务器响应的数据,在客户端使用时,要想当做json数据格式使用。有两种解决方案:
1. $.get(type):将最后一个参数type指定为"json"
2. 在服务器端设置MIME类型
response.setContentType("application/json;charset=utf-8");
前端界面:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> <script src="js/jquery-3.3.1.min.js"></script> <script> $(function () { $("#username").blur(function () { var username = $(this).val(); // 发送ajax请求 //期望服务器响应回的数据格式:{"userExsit":true,"msg":"此用户名太受欢迎,请更换一个"} // {"userExsit":false,"msg":"用户名可用"} $.get("findUserServlet",{username:username}, function (data) { var span = $("#s_username"); if (data.userExsit){ span.css("color","red"); span.html(data.msg); }else { span.css("color","green"); span.html(data.msg); } },"json"); }); }); </script> </head> <body> <form> <input type="text" id="username" name="username" placeholder="请输入用户名"> <span id="s_username"></span> <br> <input type="password" name="password" placeholder="请输入密码"><br> <input type="submit" value="注册"><br> </form> </body> </html>
相应的servlet:
@WebServlet("/findUserServlet") public class FindUserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.获取用户名 String username = request.getParameter("username"); // 2.调用service层判断用户名是否存在 //设置响应的数据格式为json response.setContentType("application/json;charset=utf-8"); Map<String , Object> map = new HashMap<>(); if("tom".equals(username)){ //存在 map.put("userExsit",true); map.put("msg","此用户名太受欢迎,请更换一个"); }else{ //不存在 map.put("userExsit",false); map.put("msg","用户名可用"); } //将map转为json,并且传递给客户端 //将map转为json ObjectMapper mapper = new ObjectMapper(); //并且传递给客户端 mapper.writeValue(response.getWriter(),map); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }