FastJson的入门

今天开始,让我们一起来学习FastJson的用法,FastJson也是一款开源的Json的解析工具,在接下来的篇章中,我们会看到它与Gson的不同之处的,FastJson号称是最快的Json解析器。

FastJson简介

JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下FastJson,FastJson是阿里的开源框架,被不少企业使用,是一个极其优秀的Json框架,Github地址: FastJson

FastJson三个核心类

  • JSON:fastjson的解析器,用于json字符串和javaBean、Json对象的转换
  • JSONObject:fastJson提供的json对象
  • JSONArray:fastJson提供json数组对象

Java API

这里,我使用的是Maven工程:

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

1.2.58的版本,尽量更新到最新版本,因为,最近fastjson报出系统漏洞问题,最新版本的已经解决该漏洞,存在循环解析死循环的问题!!!

反序列化

反序列化一个简单Json字符串

创建JavaBean的User类

public class User {

    private int id;
    private String name;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
        String json = "{'id':18,'name':'gakki'}";
        JSONObject jsonObject = JSON.parseObject(json);
       //JSONObject jsonObject1 = JSONObject.parseObject(json);  //与上面等价

        User user = new User();
        if (jsonObject.containsKey("id")) {
            user.setId(jsonObject.getInteger("id"));
        }
        if (jsonObject.containsKey("name")) {
            user.setName(jsonObject.getString("name"));
        }
        if (jsonObject.containsKey("address")) {
            user.setAddress(jsonObject.getString("address"));
        }
        System.out.println(user);
User{id=18, name='gakki', address='null'}

说明:首先我们判断json字符串的根是Json对象还是JsonArray数组,这里是Json对象,因此使用:Json.parseObject()方法 ,或者是:JSONObject.parseObject() 方法。

通过:containsKey 方法来判断是否存在key值来给JavaBean对象相应的属性赋值!

这里,因为json字符串中没有address的key,因此,最后输出的User对象中,address为null。

注意:JSON,JSONObject,JSONArray是:com.alibaba.fastjson.JSON,com.alibaba.fastjson.JSONObject,com.alibaba.fastjson.JSONArray。不是:官方的org.json.JSONObject,org.json.JSONArray。


反序列化一个简单JSON字符串成Java对象组【数组中都是相同类型对象】

        String json = "[{'id':18,'name':'gakki'},{'id':19,'name':'dj','address':'东京'},{'id':20,'name':'ldlove','address':'冲绳'}]";

        JSONArray jsonArray = JSON.parseArray(json);
        //JSONArray jsonArray1 = JSONArray.parseArray(json); //同上

        List<User> userList = new ArrayList<>();

        for (int i = 0; i < jsonArray.size(); i++) {
            User user = new User();
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            if (jsonObject.containsKey("id")) {
                user.setId(jsonObject.getInteger("id"));
            }
            if (jsonObject.containsKey("name")) {
                user.setName(jsonObject.getString("name"));
            }
            if (jsonObject.containsKey("address")) {
                user.setAddress(jsonObject.getString("address"));
            }
            userList.add(user);
        }
        System.out.println(userList);
[User{id=18, name='gakki', address='null'}, User{id=19, name='dj', address='东京'}, User{id=20, name='ldlove', address='冲绳'}]

说明:首先判断json字符串的根是Json对象还是Json数组,很明显这里是json数组,因此使用:JSON.parseArray

然后,循环遍历jsonArray,jsonArray有多个getXXXX方法,我们需要确定json数组字符串中是不是都是json对象,这里都是User对象,因此统一都使用:jsonArray.getJSONObject(i)来获取:JSONObject。如果不统一,请分开处理。


反序列化一个简单JSON字符串成Java对象组【数组中是不同类型对象】

        String json = "[1,'gakkij',{'id':18,'name':'gakki','address':'冲绳'}]";

        JSONArray jsonArray = JSONArray.parseArray(json);

        Integer id = jsonArray.getInteger(0);
        String name = jsonArray.getString(1);
        JSONObject jsonObject = jsonArray.getJSONObject(2);
        User user = new User();
        if (jsonObject.containsKey("id")) {
            user.setId(jsonObject.getInteger("id"));
        }
        if (jsonObject.containsKey("name")) {
            user.setName(jsonObject.getString("name"));
        }
        if (jsonObject.containsKey("address")) {
            user.setAddress(jsonObject.getString("address"));
        }
        System.out.println("id:" + id);
        System.out.println("name:" + name);
        System.out.println("User:" + user);
id:1
name:gakkij
User:User{id=18, name='gakki', address='冲绳'}

大家应该看出与上一个例子的差别了吧!!!


序列化

序列化一个Java Bean对象

        User user = new User();
        user.setId(18);
        user.setName("gakki");
        user.setAddress("冲绳");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("id", user.getId());
        jsonObject.put("name", user.getName());
        jsonObject.put("address", user.getAddress());
        String json = jsonObject.toString();
        String json1 = JSONObject.toJSONString(jsonObject); //等价
        String json2 = JSON.toJSONString(jsonObject); //等价

        System.out.println(json);
        System.out.println(json1);
        System.out.println(json2);
{"address":"冲绳","name":"gakki","id":18}
{"address":"冲绳","name":"gakki","id":18}
{"address":"冲绳","name":"gakki","id":18}

序列化一个对象就是使用:JSONObject来序列化。

注意:序列化的顺序不是我们put的先后顺序!!!


序列化一个java数组

        JSONArray jsonArray = new JSONArray();
        List<User> userList = new ArrayList<>();
        User user = new User(18, "gakki", "冲绳");
        User user1 = new User(20, "jackLove", "上海");
        userList.add(user);
        userList.add(user1);
        for (int i = 0; i < userList.size(); i++) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", userList.get(i).getId());
            jsonObject.put("name", userList.get(i).getName());
            jsonObject.put("address", userList.get(i).getAddress());
            jsonArray.add(jsonObject);
        }

        String json = jsonArray.toJSONString();
        String json1 = JSONArray.toJSONString(jsonArray); //等价
        String json2 = JSON.toJSONString(jsonArray);      //等价

        System.out.println(json);
        System.out.println(json1);
        System.out.println(json2);
[{"address":"冲绳","name":"gakki","id":18},{"address":"上海","name":"jackLove","id":20}]
[{"address":"冲绳","name":"gakki","id":18},{"address":"上海","name":"jackLove","id":20}]
[{"address":"冲绳","name":"gakki","id":18},{"address":"上海","name":"jackLove","id":20}]

序列化和反序列日期

Date date = new Date();

String dateString = JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss");
System.out.println(dateString);

// 输出结果 "2019-12-22 09:44:21"

String dateString1 = "{\"time\":\"2019-12-22 22:22:22\"}";
System.out.println(JSON.parseObject(dateString1));

// 输出结果 {"time":"2019-12-22 22:22:22"}

  转载请注明: 解忧杂货店 FastJson的入门

  目录