Gson与Fastjson两种Json解析神器保姆级使用攻略

简介: Gson与Fastjson两种Json解析神器保姆级使用攻略

Gson与Fastjson两种Json解析神器保姆级使用攻略

一、为什么使用Gson与Fastjson?

Ajax异步访问数据需要前端(js)和服务器端(java)进行传输数据,但是Ajax只能识别字符串,但是服务器里面的是一个java对象,需要将java对象转换为字符串(使用json ),Gson与Fastjson就是将java对象转换json串的主流工具类!


二、服务器端java对象转化json串

1、Ajax异步传递数据为什么使用json?

1. 本质就是一个字符串
2. java和js都支持json形式字符串
所以我们需要将java对象转换为json串,在前端将json串转化为js对象

2、常用的json形式数据转换工具(服务器端java转json)

  Gson(google的),**Fastjson(阿里的)转换工具** ,我们目前主要使用**Fastjson** 

3、Google的Gson

Gson是目前功能最全的Json解析神器,Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器 。Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。


4、阿里巴巴的Fastjson (主流 )

Fastjson是一个Java语言编写 的高性能的JSON处理器,由阿里巴巴公司开发。

无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。

FastJson采用独创的算法,将parse的速度提升到极致 ,超过所有json库。


三、阿里巴巴的Fastjson 的使用(主流 )

1、在maven项目中导入Fastjson 的依赖

(注:maven选择依赖小攻略:搜索maven,选择使用人数最高的一般都是用于企业开发使用的)


<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

2、创建实体类User

public class User {
    private Integer id;
    private String name;
    private String password;
    private Date birthday;

3、使用FastJson工具类转换对象

(1)单个java对象转换为JSON串

 /**
     * 转换单个对象
     */
    @Test
    public void FastJson() {
        //1.创建一个对象
        User user = new User(1, "王恒杰", "123456", new Date());
        // 打印对象
        System.out.println("User对象"+user);
        /**
         * 使用fastJson将User对象转换为json形式的字符串
         * 参数:要转化的对象
         * 返回值:json字符串
         */
        String json = JSONObject.toJSONString(user);
        System.out.println("json串"+json);
    }

转换后结果


image.png

注:我们会发现对象转换为JSON串时,日期转化不会正常显示 ,他会显示为毫秒!FastJson专门提供一个API解决日期格式转化 问题!


(2)java对象转换为JSON串日期转化方案

  /**
     * java对象转换为JSON串日期转化方案
     */
    @Test
    public void FastJson() {
        //1.创建一个对象
        User user = new User(1, "王恒杰", "123456", new Date());
        // 打印对象
        System.out.println("User对象"+user);
        /**
         * 2.使用fastJson将User对象转换为json形式的字符串
         * 参数:要转化的对象
         * 返回值:json字符串
         */
        String json1 = JSONObject.toJSONString(user);
        System.out.println("json串"+json1);
        /**
         * 3.fastJson日期格式转化API
         *  参数1:要转化的对象
         *  参数2:日期转化 可以写成 yyy-mm-dd && yyyy-mm-dd hh:mm:ss两种
         *  返回值:日期格式化后的json串
         */
        String json2 = JSONObject.toJSONStringWithDateFormat(user, "yyyy-mm-dd hh:mm:ss");
        System.out.println("日期格式化后的json串"+json2);
    }

转换后结果

image.png


(3)List集合对象转换为JSON串

  @Test
    public void ListByFastJsonTest(){
        //1.创建List集合
        ArrayList<User> list = new ArrayList<>();
        //2,添加数据
        list.add(new User(1, "王恒杰1", "123456", new Date()));
        list.add(new User(2, "王恒杰2", "123456", new Date()));
        list.add(new User(3, "王恒杰3", "123456", new Date()));
        list.add(new User(4, "王恒杰4", "123456", new Date()));
        //通过fastJson将List集合转换为json串
        String listUser = JSONObject.toJSONStringWithDateFormat(list, "yyyy-mm-dd");
        System.out.println(listUser);
    }

转换后结果


image.png

(4)map集合对象转换为JSON串

  @Test
    public void MapByFastJsonTest() {
        //1.创建map集合
        Map<String, String> map = new HashMap<>();
        //2,添加数据
        map.put("1号选手", "王恒杰1");
        map.put("2号选手", "王恒杰2");
        map.put("3号选手", "王恒杰3");
        map.put("4号选手", "王恒杰4");
        //通过fastJson将map集合转换为json串
        String json = JSONObject.toJSONString(map);
        System.out.println(json);
    }

转换后结果

image.png

(5)使用注解的方法解决日期格式

实体类User:

image.png


测试方法:

 @Test
    public void DateByFastJsonTest(){
        User user = new User();
        user.setBirthday(new Date());
        String json = JSONObject.toJSONString(user);
        System.out.println(json);
    }

转换后结果

image.png


四、Google的Gson 的使用(功能最全 )

先对与fastJson来说:Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。因为我很少使用,所以Gson我就测试了一个!


1、在maven项目中导入Fastjson 的依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

2、创建实体类User

public class User {
    private Integer id;
    private String name;
    private String password;
    private Date birthday;

3、单个java对象转换为JSON串:toJson

    /**
     * Gson转换单个对象
     */
    @Test
    public void Gson() {
        //1.创建一个对象
        User user = new User(1, "王恒杰", "123456", new Date());
        // 打印对象
        System.out.println("User对象" + user);
        /**
         * 2.使用Gson将User对象转换为json形式的字符串
         */
        Gson gson = new Gson();
        String json = gson.toJson(user);
        System.out.println(json);
    }

转换后结果


image.png

4、java对象转换为JSON串日期转化方案

 @Test
    public void DateGson() {
        //1.创建一个对象
        User user = new User(1, "王恒杰", "123456", new Date());
        // 打印对象
        System.out.println("User对象" + user);
        /**
         * 2.使用Gson将User对象转换为json形式的字符串
         */
        GsonBuilder builder = new GsonBuilder();
        Gson gson = builder.setDateFormat("yyyy-mm-dd").create();
        String json = gson.toJson(user);
        System.out.println(json);
    }

转换后结果

image.png


五、如何选择Gson || FastJson

在项目选型的时候可以使用Google的Gson和阿里巴巴的FastJson两种并行使用,

如果只是功能 要求,没有性能 要求,可以使用google的Gson,

如果有性能上面的要求可以使用Gson将bean转换json确保数据的正确,使用FastJson将Json转换Bean


六、前端将json串转换为js中的json对象

//json形式字符串:xhr.responseText
1. 转换方式1: var JsJsonObject=JSON.parse(xhr.responseText);
2. 转换方式2:  var JsJsonObject=eval("+(xhr.responseText)+");
JSJsonObject属性名 获取对应属性值

前后端json转化总结:

1. java对象:使用json转换工具(FastJson) 将对象转换为json串 再进行转换
2. js: 将接收到的json字符串转换为js中的json对象

七、FastJson实用案例

1、案例要求:单击展示单个用户信息 & 验证用户名是否存在


image.png

2、具体实现

(1)技术选型:

    Servlet+html+Ajax+js(主要展示ajax&FastJson效果),Ajax我们使用的是原生js实现

(2)所需要依赖

 

    <!--Servlet依赖主要用于后端使用 注意使用Servlet的注解配置路径一定要3以后的版本-->
      <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <!--用要用于跳转页面时使用和相对路径-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
    </dependency>
    <!--FastJson工具所需依赖-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>

(3)实体类User

public class User {
    private Integer id;
    private String name;
    private String password;
    private Date birthday;

(3)html

<body>
用户名:<input type="text" id="name" name="name"><span id="msg"></span></br>
<input type="submit" id="btn" value="输入姓名点击展示用户信息">
</body>

(4)ajax实现数据传输

   <script type="text/javascript">
        <%--先加载页面后执行js对象--%>
        window.onload = function () {
            var name = document.getElementById("name");
            //获取
            var nameValue = name.value;
            //为按钮绑定移出输入窗口事件
            name.onblur = function () {
                // 1.创建Ajax异步请求对象
                let xhr = new XMLHttpRequest();
                //2.发送请求
                xhr.open("post", "${pageContext.request.contextPath}/checkName");
                xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
                xhr.send("name=" + nameValue);
                //3.处理响应  onreadystatechange函数会在readyState属性发生改变时被调用
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4) {
                        //4.获取响应更新页面局部
                        if (xhr.status == 200) {
                            var msg = document.getElementById("msg");
                            msg.innerText = xhr.responseText
                        }
                    }
                }
            }
            var btn = document.getElementById("btn");
            btn.onclick = function () {
                var xhr = new XMLHttpRequest();
                xhr.open("post", "${pageContext.request.contextPath}/user");
                xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
                xhr.send("name=" + nameValue);
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        //打印结果  json形式的字符串
                        console.log(xhr.responseText);
                        //将接收的json字符串转化为js中json对象
                        var user = JSON.parse(xhr.responseText);
                        console.log(user);
                    }
                }
            }
        }
    </script>

(5)servlet实现后端

单击展示单个用户信息

  @WebServlet("/checkName")
public class CheckServlet extends HttpServlet {
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //统一编码格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;setchar=utf-8");
        response.setCharacterEncoding("utf-8");
        //接收数据
        String name = request.getParameter("name");
        User user = new User(1, "王恒杰", "123456", new Date());
        //处理业务
        if (user.getName().equals(name)) {
            response.getWriter().print("用户可以被查询到!");
        } else {
            //验证用户名是否存在
            response.getWriter().print("用户不存在");
        }
    }
}

验证用户名是否存在

@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //统一编码格式
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;setchar=utf-8");
        response.setCharacterEncoding("utf-8");
        //接收数据
        String name = request.getParameter("name");
        User user = new User(1, "王恒杰", "123456", new Date());
        //处理业务
            // 响应输出流 向客户端响应内容
            String jsonUser = JSONObject.toJSONStringWithDateFormat(user, "yyyy-mm-dd");
            response.getWriter().print(jsonUser);
    }
}

效果展示:

效果.gif




相关文章
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
627 0
|
SQL 存储 JSON
SQL,解析 json
SQL,解析 json
292 8
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
743 4
JSON数据解析实战:从嵌套结构到结构化表格
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
JSON 小程序 UED
微信小程序 app.json 配置文件解析与应用
本文介绍了微信小程序中 `app.json` 配置文件的详细
2038 12
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
565 12
|
JSON JavaScript 前端开发
一次采集JSON解析错误的修复
两段采集来的JSON格式数据存在格式问题,直接使用PHP的`json_decode`会报错。解决思路包括:1) 手动格式化并逐行排查错误;2) 使用PHP-V8JS扩展在JavaScript环境中解析。具体方案一是通过正则表达式和字符串替换修复格式,方案二是利用V8Js引擎执行JS代码并返回JSON字符串,最终实现正确解析。 简介: 两段采集的JSON数据因掺杂JavaScript代码导致PHP解析失败。解决方案包括手动格式化修复和使用PHP-V8JS扩展在JavaScript环境中解析,确保JSON数据能被正确处理。
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
837 0
在Java中处理JSON数据:Jackson与Gson库比较
|
JSON 安全 fastjson
高性能 JSON 处理:为何选择 Fastjson?
Fastjson 是由阿里巴巴集团开发的一个高性能的 JSON 处理库,它支持 Java 对象与 JSON 字符串之间的互相转换。
2134 0
高性能 JSON 处理:为何选择 Fastjson?
|
JSON JavaScript API
商品详情数据接口解析返回的JSON数据(API接口整套流程)
商品详情数据接口解析返回的JSON数据是API接口使用中的一个重要环节,它涉及从发送请求到接收并处理响应的整个流程。以下是一个完整的API接口使用流程,包括如何解析返回的JSON数据:

热门文章

最新文章

推荐镜像

更多
  • DNS