大家好,我是IT修真院北京分院java第27期学员,一枚正直纯洁善良的java程序员。
今天给大家分享一下,修真院官网JAVA 任务2的知识点
————生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。</p>
JSON是由道格拉斯·克罗克福特在2001年开始推广使用的数据格式,在2005年-2006年正式成为主流的数据格式,雅虎和谷歌就在那时候开始广泛地使用JSON格式。
在这之前当时通用的数据交换语言是XML。因为道格拉斯·克罗克福特认为XML的生成和解析都过于麻烦,所以他提出一种更加简化的格式,就是我们现在使用的JSON。
为什么要用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页面即可,不需要改动控制器代码
后端怎样传给前端一个JSON数据?
使用posman测试接口时怎么传给后端json数据?
前端使用ajax与后端交互,后端返回JSON键值对给前端
生成JSON有几种方式?
1、使用google的gson
2、使用@ResponseBody注解
3、使用taglib的方法来在jsp中返回
@1.Gson方式:
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;
}
}
测试类:
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注解
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);
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中返回
*****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;
}
json和xml的区别
参考一(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
鸣谢
感谢大家观看
------------------------------------------------------------------------------------------------------------------------
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~