在Java中使用JSON

一、JSON概述

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,与开发语言无关。 JSON 易于阅读和编写,同时也易于机器解析和生成,因此常用来在前后端进行数据交换。

JSON 的数据结构
这里写图片描述
对象(object):一个对象包含一系列非排序的键/值对,一个对象以 { 开始,并以 } 结束。每个键/值对之间使用 : 分区。多个键值对之间通过 , 分割。需要注意的是JSON 的键是一个 String 类型的字符串。

JSON 值的格式
这里写图片描述
值(value):可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套使用。

二、JSON数据结构举例

下面是一个 JSON 数据格式的例子

{
    "array": [1, 2, 3],
    "boolean": true,
    "null": null,
    "number": 123,
    "object": {
        "a": "b",
        "c": "d",
        "e": "f"
    },
    "string": "Hello World"
}
  • array:值是一个整数类型的数组
  • boolean:值是一个布尔型的值
  • null:JSON 数据格式中的值允许为 null
  • number:值一个数值,可以是整数也可以是浮点数
  • object:值是一个 JSON 对象
  • string:值是一个字符串

三、在Java中使用JSONObject

这里以 Maven 的形式创建项目,如果你对 Maven 还不是很了解,可以下载对应的 jar 包。

pom.xml 中引入 JSONObject 依赖

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20180130</version>
</dependency>

编写测试方法 jsonObjectTest()

    public static void jsonObjectTest() {
        JSONObject jsonObject = new JSONObject();
        Object obj = null;

        jsonObject.put("name", "张三");
        jsonObject.put("age", 20);
        jsonObject.put("birth", "1998-01-01");
        jsonObject.put("haveCar", obj);
        jsonObject.put("hasGirlfriend", true);
        jsonObject.put("likes", new String[]{"看电影", "看书"});

        if(!jsonObject.isNull("name")) {
            System.out.println(jsonObject.getString("name"));    // 获取某个键对应的值
        }

        System.out.println(jsonObject.toString());    // 输出 JSON 字符串
    }

运行上面的代码输出的是不规则的字符串,你可以到https://jsoneditoronline.org/上对 JSON 数据进行格式化,下面是其显示效果
这里写图片描述
在字符串输出的时候会发现,输出的字符串与数据存储的顺序可能是不一致的。原因是调用jsonObject.put()方法的时候,其底层是一个 HashMap,数据被存到了HashMap 中。 HashMap 根据键的哈希码来决定键的位置,所以可能会出现上面的问题。下面是源代码
这里写图片描述
既然jsonObject.put() 方法的底层是对 HashMap 的操作,那么能否将一个 HashMap 转换成 JSON 数据呢?答案是可以的。原因是 JSONObject 类提供了一个构造函数,这个构造函数中接收的正是一个 Map。下面是源代码:
这里写图片描述

四、JavaBean TO JSON(JSONObject

在前后端交换数据的时候,后端通常会使用一个 JavaBean 把数据封装一下,然后将这个 JavaBean 转成 JSON 数据。下面我们就来这么做

JavaBean 对象User

public class User {
    private String name;
    private int age;
    private String[] likes;
    // 省略 get 与 set 方法
}

编写测试方法 beanToJsonTest()

    public static void beanToJsonTest() {
        User user = new User();

        user.setName("张三");
        user.setAge(20);
        user.setLikes(new String[]{"看电影", "看书"});

        JSONObject jsonObject = new JSONObject(user);
        System.out.println(jsonObject.toString());
    }

有兴趣的可以查看一下源码这个过程是如何完成的。

五、在Java中使用Gson

GSON 是 Google 的一个开源项目,其主要特点是可以将 JavaBean 转换成 JSON 数据,也可以将 JSON 数据转换成 JavaBean。

pom.xml 中引入 Gson 依赖

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

JavaBean TO JSON(GSON):

测试方法beanToJsonTest()

    public static void beanToJsonTest() {
        User user = new User();

        user.setName("张三");
        user.setAge(20);
        user.setLike(new String[]{"看电影", "看书"});

        /**
        * 使用GsonBuilder 可以作一些额外处理,比如格式化输出,预处理等
        * 
        * GsonBuilder gsonBuilder = new GsonBuilder();
        * gsonBuilder.setPrettyPrinting();    
        * Gson gson = gsonBuilder.create();
        */
        Gson gson = new Gson();
        System.out.println(gson.toJson(user));
    }

JSON TO JavaBean(GSON):

改写 User 类(添加 Date 属性)

public class User {
    private String name;
    private int age;
    private String[] likes;
    private Date birth;
    // 省略 get 与 set 方法
}

测试方法jsonToBeanTest()

    public static void jsonToBeanTest() {
        String jsonStr = "{\"name\":\"李四\",\"age\":22
            , \"like\":[\"看电影\",\"看书\"],\"birth\":\"1996-01-01\"}";
        GsonBuilder gsonBuilder = new GsonBuilder();
        // 设置日期转换格式
        gsonBuilder.setDateFormat("yyyy-MM--dd");   
        Gson gson = gsonBuilder.create();
        User user = gson.fromJson(jsonStr, User.class);

        System.out.println(user.getBirth().toLocaleString());
        System.out.println(user.getLikes()[1]);
    }

PS:
现在 fastjson 好像使用的挺多的,fastjson 以速度快、使用简单、功能完备等优点深受广大程序员喜欢。有机会的话,还是要多了解一些。

猜你喜欢

转载自blog.csdn.net/codejas/article/details/80419763