生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
大家好,我是IT修真院北京分院java第27期学员,一枚正直纯洁善良的java程序员。
今天给大家分享一下,修真院官网JAVA 任务2的知识点
————生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
1.背景介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。</p>
JSON是由道格拉斯·克罗克福特在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。
在这之前当时通用的数据交换语言是XML。因为道格拉斯·克罗克福特认为XML的生成和解析都过于麻烦,所以他提出一种更加简化的格式,就是我们现在使用的JSON。
2.知识剖析
为什么要用json?
JSON类似于XML、比XML更小、更快、更容易解析。但同时XML也有它不可替代性,应根据使用场景进行更合适的选择
JSON语法简单,很容易理解,并且对象信息自描述,数据传输量小不占用宽带
JSON支持的语言包括C、C#、Java、JavaScript,PHP,Python、Ruby等等
对于Ajax应用程序来说,JSON比XML更快捷,更易用
JSON的基本语法
1.并列的数据之间用逗号(,)分隔
2.映射用冒号(:)表示
3.映射的集合用大括号({})表示
4.并列数据的集合用方括号表示([])表示
下面是一个json格式的例子:
{ "studentList": [{
"id": 4885,
"studentName": "java工程师",
"uId": 77,
"releaseAt": 1533254680,
"responsibility": "负责打PM",
"requirement": "会皮就行",
"welfare": "98k"} ] }
可以看到它们是以键值对的形式表现,这里有个规定键值对中: 键必须用双引号括起来,值可以是数字、字符串(需要在双引号中),布尔值、数组、对象、null,共6种类型。
为什么推荐使用JSONTAGLIB来处理JSON
gson用的少,暂且先不表。若想探究竟,别用百度找。
在使用@ResponseBody注解的方式时,
如果在控制器方法上标注该注解, 那么方法返回的对象不会经过视图解析器的渲染,而是根据HTTP Request Header的Accept字段的内容, 转换为指定的格式, 写入到Response对象的body数据区中,如果没有额外的配置,那么就会返回json格式的数据
这种方法,我们需要在controller中写更多的代码,而且要保证不会轻易改动,以我的能力来说,这是不可能的2333333
所以json-taglib的好处就体现出来了:
1.使用json-taglib,在控制器中的代码更加简洁,易读
2.使用json-taglib更加灵活,如果以后需要更改json数据格式,只需要更改jsp页面即可,不需要改动控制器代码
3. 常见问题
后端怎样传给前端一个JSON数据?
使用posman测试接口时怎么传给后端json数据?
4. 解决方案
前端使用ajax与后端交互,后端返回JSON键值对给前端
5. 编码实战
生成JSON有几种方式?
1、使用google的gson
2、使用@ResponseBody注解
3、使用taglib的方法来在jsp中返回
@1.Gson方式:
[code]package com.lihoo.ssm.gai.model; import java.util.Date; /** * #Title: UserX * #ProjectName spring_springMVC_mybatis_SMM_JSON * #Description: TODO * #author lihoo * #date 2018/8/14-15:54 */ @SuppressWarnings("unused") public class UserX { private Integer id; private int age; private String userName; private Date birthday; public UserX() { super(); } public UserX(Integer id, int age, String userName, Date birthday) { super(); this.id = id; this.age = age; this.userName = userName; this.birthday = birthday; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
测试类:
[code] import java.util.Date; import java.util.List; import java.util.Set; import com.lihoo.ssm.gai.model.UserX; import org.junit.Test; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.reflect.TypeToken; /** * #Title: GsonTest * #ProjectName spring_springMVC_mybatis_SMM_JSON * #Description: 0000 * #author lihoo * #date 2018/8/14-15:43 */ @SuppressWarnings("unused") public class GsonTest { @Test public void test1() { Gson gson = new Gson(); UserX userX = new UserX(1, 20, "AA", new Date()); System.out.println("Bean->转换为JSON字符串:"); String jsonStr = gson.toJson(userX); System.out.println(jsonStr); System.out.println("安排"); } @Test public void test2() { Gson gson = new Gson(); String jsonStr = "{\"id\":1,\"age\":20,\"userName\":\"AA\",\"birthday\":\"Nov 14, 2016 4:52:38 PM\"}"; System.out.println("字符串->转换成Bean对象"); UserX UserX = gson.fromJson(jsonStr, UserX.class); System.out.println(UserX); System.out.println("反向"); } @Test public void test3() { Gson gson = new Gson(); System.out.println("json转换复杂的bean,比如List,Set,Map:"); String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]"; List list = gson.fromJson(json, new TypeToken<List>() { }.getType()); Set set = gson.fromJson(json, new TypeToken<Set>() { }.getType()); System.out.println(list); System.out.println(set); System.out.println("皮一下"); } @Test public void test4() { Gson gson = new Gson(); String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]"; System.out.println("格式化JSON:"); gson = new GsonBuilder().setPrettyPrinting().create(); JsonParser jp = new JsonParser(); JsonElement je = jp.parse(json); json = gson.toJson(je); System.out.println(json); System.out.println("JSON板正"); } @Test public void test5() { System.out.println("判断字符串是否是json,通过捕捉的异常来判断是否是json"); String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]"; boolean jsonFlag; try { new JsonParser().parse(json).getAsJsonObject(); jsonFlag = true; } catch (Exception e) { jsonFlag = false; } System.out.println(jsonFlag + ":" + jsonFlag); System.out.println("对错"); } @Test public void test6() { System.out.println("从json串中获取属性"); String json = "{\"id\":\"1\",\"name\":\"Json技术\"}"; String propertyName = "name"; String propertyValue = ""; try { JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(json); JsonObject jsonObj = element.getAsJsonObject(); propertyValue = jsonObj.get(propertyName).toString(); System.out.println("propertyValue:" + propertyValue); } catch (Exception e) { propertyValue = null; } System.out.println(); } @Test public void test7() { System.out.println("除去json中的某个属性"); String json = "{\"id\":\"1\",\"name\":\"Json技术\"}"; String propertyName = "id"; JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(json); JsonObject jsonObj = element.getAsJsonObject(); jsonObj.remove(propertyName); json = jsonObj.toString(); System.out.println("json:" + json); System.out.println(); } @Test public void test8() { System.out.println("向json中添加属性"); String json = "{\"id\":\"1\",\"name\":\"Json技术\"}"; String propertyName = "desc"; Object propertyValue = "json各种技术的调研"; JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(json); JsonObject jsonObj = element.getAsJsonObject(); jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue)); json = jsonObj.toString(); System.out.println("json:" + json); System.out.println(); } @Test public void test9() { System.out.println("修改json中的属性"); String json = "{\"id\":\"1\",\"name\":\"Json技术\"}"; String propertyName = "name"; Object propertyValue = "json各种技术的调研"; JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(json); JsonObject jsonObj = element.getAsJsonObject(); jsonObj.remove(propertyName); jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue)); json = jsonObj.toString(); System.out.println("json:" + json); System.out.println(); } @Test public void test10() { System.out.println("判断json中是否有属性"); String json = "{\"id\":\"1\",\"name\":\"Json技术\"}"; String propertyName = "name"; boolean isContains = false; JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(json); JsonObject jsonObj = element.getAsJsonObject(); isContains = jsonObj.has(propertyName); System.out.println("isContains:" + isContains); System.out.println(); } @Test public void test11() { System.out.println("json中日期格式的处理"); GsonBuilder builder = new GsonBuilder(); builder.setDateFormat("yyyy-MM-dd"); Gson gson = builder.create(); UserX UserX = new UserX(); UserX.setBirthday(new Date()); String json = gson.toJson(UserX); System.out.println("json:" + json); System.out.println(); } @Test public void test12() { System.out.println("json中对于Html的转义"); GsonBuilder builder = new GsonBuilder(); builder.disableHtmlEscaping(); Gson gson = builder.create(); System.out.println(); } }
@2. @ResponseBody注解
[code]package com.lihoo.ssm.gai.controller; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.lihoo.ssm.gai.model.Student; import com.lihoo.ssm.gai.model.User; import com.lihoo.ssm.gai.service.StudentService; import com.lihoo.ssm.gai.service.UserService; import com.lihoo.ssm.gai.util.Page; import com.sun.org.apache.xpath.internal.operations.Mod; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import java.util.List; /** * @author lihoo * @Title: StudentController * @ProjectName spring_springMVC_mybatis_SMM_1 * @Description: TODO * @date 2018/8/8-12:54 */ @Controller @RequestMapping("") public class StudentController { private static Logger logger = Logger.getLogger(StudentController.class); @Autowired StudentService studentService; ******RequestBody******** // @ResponseBody:此注解完成返回对象到json数据的转换 @ResponseBody @RequestMapping(value = "/student", method = RequestMethod.GET) public List<Student> findStudentList() throws Exception { logger.debug("开始获取数据!"); // ModelAndView mav = new ModelAndView(); // PageHelper.offsetPage(page.getStart(), 5); 1c140 List<Student> stus = studentService.findStudentList(); // int total_page = (int) new PageInfo<>(stu).getTotal(); // page.caculateLast(total_page); // 放入转发参数 // mav.addObject("stu", stu); // 放入jsp路径 // mav.setViewName("listStudent"); // return mav; logger.debug("OK"); return stus; } //// *****json-taglib******* // // @RequestMapping(value = "/student", method = RequestMethod.GET) // public ModelAndView listStudent() throws Exception { // ModelAndView mav = new ModelAndView(); // List<Student> stus = studentService.findStudentList(); // mav.addObject("stus", stus); // mav.setViewName("jsonTaglib"); // logger.debug("OJBK"); // return mav; // } // @RequestBody:此注解用来接收前台传来的json数据(在此例中) @RequestMapping(value = "/student", method = RequestMethod.POST) public String addStudent(@RequestBody Student student) throws Exception { logger.debug("增加学生"); studentService.addStudent(student); // ModelAndView mav = new ModelAndView("redirect:/student"); // return mav; logger.debug("成功添加学生信息"); return "addStudent success"; } // @PathVariable:此注解可以将url路径中传过来的值绑定到方法的参数上 // 可以写成 @PathVariable long id ; // 也可以 @PathVariable("id") long id (当有多个值时使用后者) @ResponseBody @RequestMapping(value = "/student/{id}", method = RequestMethod.DELETE) public String deleteStudent(@PathVariable long id) throws Exception { studentService.deleteStudent(id); logger.debug("成功删除id为"+id+"的学生信息"); // ModelAndView mav = new ModelAndView("redirect:/student"); // return mav; return "delete success"; } @ResponseBody @RequestMapping(value = "/student/{id}", method = RequestMethod.GET) public Student getStudent(@PathVariable long id) throws Exception { Student stu = studentService.findStudentById(id); // ModelAndView mav = new ModelAndView("editStudent"); // mav.addObject("stu", stu); // return mav; logger.debug("成功查询到id:"+id+"的信息"); return stu; } // 方法中接收了两个参数,URL路径中的和body中 @ResponseBody @RequestMapping(value = "/student/{id}", method = RequestMethod.PUT) public String updateStudent(@PathVariable long id,@RequestBody Student student) throws Exception { // 进行更新操作时一定要对数据模型设置id,因为在使用SQL语句更新时有一个id参数 student.setId(id); studentService.updateStudent(student); logger.debug(student); logger.debug("成功更新id:"+id+"的学生信息"); // ModelAndView mav = new ModelAndView("redirect:/student"); // return mav; return "update success"; } }
@3.taglib的方法来在jsp中返回
[code] //// *****json-taglib******* @RequestMapping(value = "/student", method = RequestMethod.GET) public ModelAndView listStudent() throws Exception { ModelAndView mav = new ModelAndView(); List<Student> stus = studentService.findStudentList(); mav.addObject("stus", stus); mav.setViewName("jsonTaglib"); logger.debug("OJBK"); return mav; }
6. 扩展思考
json和xml的区别
7. 参考文献
参考一(ResponseBody注解的解释):http://www.cnblogs.com/qq78292959/p/3760651.html
参考二(json的各种依赖解释):http://www.cnblogs.com/kunpengit/p/4001680.html
参考三(json-taglib官网):http://json-taglib.sourceforge.net/tutorial.html
参考四(json和xml): http://www.sojson.com/blog/1.html
参考五(gson): https://blog.csdn.net/qq_15766297/article/details/70503214
8.更多讨论
8. 更多讨论
鸣谢
感谢大家观看
------------------------------------------------------------------------------------------------------------------------
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
阅读更多- 什么是 "use strict"? 使用它的好处和坏处分别是什么?
- 使用jackson和fastjson分别生成json字符串的方式
- 主键的生成方式有几种?分别是什么?
- 使用XStream处理Xml文档和实体类之间的转换的几种方式
- 为什么要使用INTERFACE,而不是直接使用一个实体类来完成任务?INTERFACE和IMPL这种方式的好处是什么?
- 为什么要使用INTERFACE,而不是直接使用一个实体类来完成任务? INTERFACE和IMPL这种方式的好处是什么?
- 继承有几种方式,分别是什么,想要实现继承可以使用哪些方法
- 同步和异步有何异同,在什么情况下分别使用他们?
- json使用案例以及几种解析json方式
- 使用xml或者json方式生成dhtmlxtree
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- 【转+分析】JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?
- CSS定位方式有哪些,他们之间的区别是什么?
- 几种使用itext生成pdf的方式
- Android注册广播有几种方式,分别是什么?
- String为什么推荐使用直接赋值的方式?
- 什么是设计模式?为什么要使用设计模式?有什么好处?
- 使用Spring MVC+Maven生成Json数据(两种方式)
- 字符串判空的几种方式以及他们之间的区别
- 什么是设计模式?为什么要使用设计模式?有什么好处?