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

大家好,我是IT修真院北京分院java第27期学员,一枚正直纯洁善良的web程序员。

今天给大家分享一下,修真院官网JAVA  任务1的知识点

————生成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方式:

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;
    }

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. 更多讨论

鸣谢

感谢大家观看

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

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

猜你喜欢

转载自blog.csdn.net/lihoo747/article/details/81670885