您的位置:首页 > Web前端 > JavaScript

生成Json有几种方式,他们之间的好处和坏处分别是什么,为什么推荐使用JsonTaglib来处理Json?

2018-08-14 18:16 393 查看

大家好,我是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. 更多讨论

 

鸣谢

感谢大家观看

------------------------------------------------------------------------------------------------------------------------

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐