JSON框架之阿里fastjson的介绍

  1. 前言

1.3 FastJson介绍

在日常的java项目开发中,JSON的使用越来越频繁,对于Json的处理工具也有很多。接下来就介绍一下阿里开源的一个高性能的JSON框架FastJson,功能完善,完全支持标准JSON库,现在已经越来越受到开发者的青睐。

1.2 FastJson的特点:

    1) FastJson数据处理速度快,无论序列化(把JavaBean对象转化成Json格式的字符串)和反序列化(把JSON格式的字符串转化为Java Bean对象),都是当之无愧的fast

    2) 功能强大(支持普通JDK类,包括javaBean, Collection, Date 或者enum)

    3) 零依赖(没有依赖其他的任何类库)

1.3 FastJson的简单说明:

FastJson对于JSON格式的字符串的解析主要是用到了下面三个类:

    1) JSON:FastJson的解析器,用于JSON格式字符串与JSON对象及JavaBean之间的转化。也是最基础的一个类,因为看过源码之后会发现,下面的两个类继承了JSON类,其中很多方法的实现也是基于JSON类中的parse()方法。

    2) JSONObject: FastJson提供的json对象,用于将String对象、javaBean、Collection等解析为JSON格式的对象

    3) JSONArray: FastJson提供json数组对象


2. FastJson的基础用法。

首先,我们定义两个json格式的字符串,以及两个JavaBean(使用了lombok)。方便我们在下面的代码中去使用FastJson中的方法。

String jsonString = "{\"errno\":0,\"data\":{\"count\":6,\"datastreams\":[{\"datapoints\":" +
                "[{\"at\":\"2018-05-01 15:33:25.000\",\"value\":{\"lon\":\"104.07803838511\"," +
                "\"lat\":\"30.633662874767996\"}},{\"at\":\"2018-04-29 17:37:25.000\",\"value\":" +
                "{\"lon\":\"106.54504673673999\",\"lat\":\"29.555934913502\"}},{\"at\":" +
                "\"2018-04-29 17:28:47.000\",\"value\":{\"lon\":\"106.5450423966\",\"lat\":" +
                "\"29.555937892982\"}},{\"at\":\"2018-04-29 17:08:25.000\",\"value\":{\"lon\":\"106.54504104044\"," +
                "\"lat\":\"29.555938434163\"}},{\"at\":\"2018-04-29 17:03:28.000\",\"value\":" +
                "{\"lon\":\"104.07765307713001\",\"lat\":\"30.634041802113998\"}}," +
                "{\"at\":\"2018-04-26 15:02:20.000\",\"value\":{\"lon\":\"104.07796817860999\",\"lat\":" +
                "\"30.633655490910996\"}}],\"id\":\"GPS\"}]},\"error\":\"succ\"}";
String beanStr = "{\"at\":\"2018-01-01\",\"value\":{\"lat\":\"456\",\"lon\":\"123\"}}";

jsonString字符串对应的JSON格式,以及beanStr字符串对应的Json格式分别为:



import lombok.Data;

/**
 * Created by songyangguang on 2018/5/10.
 */
@Data
public class Location {
    private String lon;
    private String lat;
}
import lombok.Data;

/**
 * Created by songyangguang on 2018/5/10.
 */
@Data
public class Datapoint {
    private String at;
    private Location value;
}

2.1 JSON格式字符串与JSON对象之间的转换

/**
     * json字符串-简单对象类型到JSONObject的转换
     * @param jsonStr
     */
    private static JSONObject testJsonStrToJSON(String jsonStr) {
        //将Json格式的字符串转化为JSON,这样才能按照层级读取JSON数据中的值
        JSONObject jsonObject = JSONObject.parseObject(jsonStr);
        System.out.println(jsonObject.getInteger("errno"));
        System.out.println(jsonObject.getJSONObject("data"));
        System.out.println(jsonObject.getString("error"));
        
        return jsonObject;
    }

    /**
     * JSONObject到json字符串-简单对象型的转换
     * @param jsonObject
     */
    private static void testJsonObjectToJsonStr(JSONObject jsonObject) {
        String jsonStr = jsonObject.toJSONString();
        System.out.println(jsonStr);
    }

其实,String——》JSON格式的转化,就是使用了JsonObject中的解析函数parseObject(String参数)。只有解析为JSON对象后,才能进行层级取值(JsonObject对象中的get***(String key)函数取出相应类型的值)。

    注:层级是指Json格式每一层的key-value的值(每次只能取最近一层的值)。如下图


一个Json格式的数据,所以,一次只能通过jsonObject.get***(key)读取第一层(最近)的数据。第二层的数据只能通过JsonObject.getJsonObject("data")获取第二层的数据,然后通过getString("key")等获取对应的值。这就是所谓的按照层级。

2.2 json字符串(数组类型)与JSONArray之间的转换

/**
     *JsonArray与Json字符串-数组类型的转化
     * @param jsonArray
     */
    private static void testJSONArrayToJsonStr(JSONArray jsonArray) {
        String arrStr = JSONArray.toJSONString(jsonArray);
        System.out.println(arrStr);
    }

    /**
     * Json字符串-数组类型到JSONArray的转换
     * @param jsonString
     */
    private static JSONArray testJsonStrToJSONArray(String jsonString) {

        JSONObject jsonObject = JSONObject.parseObject(jsonString);
        //获取data数据,然后读取data数据中datastreams关键字对应的数组(有[]标示的为数组)
        JSONArray jsonArray1 = jsonObject.getJSONObject("data").getJSONArray("datastreams");
        //获取JsonArray下标对应的JsonObject
        JSONObject jsonArray2 = jsonArray1.getJSONObject(0);
        //其中的关键字datapoints对应的也是一个JsonObject数组
        JSONArray jsonArray3 = jsonArray2.getJSONArray("datapoints");
        System.out.println(jsonArray3);

     /*   int size = jsonArray3.size();
        //遍历1
        for(int i = 0; i < size; i++) {
            System.out.println(jsonArray3.getJSONObject(i));
        }*/

        //遍历2
        for(Object object: jsonArray3){
            System.out.println(object);
        }
        return jsonArray3;
    }

其中,我们可以通过观察JSON格式的数据来确定层级的内容,以及是Object还是ArrayObject。如下图:



可以通过正常的数组遍历每一个Object。

2.3 简单的JavaBean与Json对象之间的转化

前面我们以及定义两个bean。

/**
     * 简单json对象到JavaBean_obj的转换
     *
     * 步骤:第一步将 JsonString转化为JSON格式的数据
     * 第二:通过JSONObject.parseObject(*,*)方法转化
     */
    private static void testJsonToJsonBean() {
        
        JSONObject jsonObject = JSONObject.parseObject(beanStr);

        //第一种方式:使用TypeRefernce<T>,由于其构造方式使用protected进行修饰,故创建其子类
        Datapoint datapoint = JSONObject.parseObject(jsonObject.toJSONString(),new TypeReference<Datapoint>() {});

        System.out.println(datapoint);
    }

    /**
     * 简单javaBean到json对象的转换
     */
    private static void testJavaBeanToJson() {
        //模拟一个javaBean数据
        Datapoint datapoint = new Datapoint();
        Location location = new Location();

        location.setLon("123");
        location.setLat("456");
        datapoint.setAt("2018-01-01");
        datapoint.setValue(location);
        //一步实现
        String jsonString = JSONObject.toJSONString(datapoint);
        System.out.println(jsonString);
    }


2.4 JavaList对象数组与JsonArray之间的转化

/**
     * 将JavaBeanList 转化为JsonArray
     */
    private static void testJavaListToJsonArray() {
        //模拟一个List<JabaBean>
        Location location1 = new Location();
        Location location2 = new Location();
        Datapoint datapoint1 = new Datapoint();
        Datapoint datapoint2 = new Datapoint();
        List<Datapoint> datapoints = new ArrayList<Datapoint>();
        location1.setLon("1122");
        location1.setLat("2233");
        datapoint1.setAt("2018-01-02");
        datapoint1.setValue(location1);
        datapoints.add(datapoint1);
        location2.setLon("3344");
        location2.setLat("4455");
        datapoint2.setAt("2018-01-03");
        datapoint2.setValue(location2);
        datapoints.add(datapoint2);

        //方法一:
        String arrString = JSONArray.toJSONString(datapoints);
        JSONArray jsonArray = JSONArray.parseArray(arrString);
        System.out.println(jsonArray);
        //方法二:
        JSONArray jsonArray1 = (JSONArray) JSONArray.toJSON(datapoints);
        System.out.println(jsonArray1);
    }

    //JavaList与JsonArray之间的转换
    private static void testJsonArrayToJavaList(String jsonString) {
        //已知JsonArray
        JSONArray jsonArray = testJsonStrToJSONArray(jsonString);

        //方法一:使用TypeReference<T>类,由于其构造方法使用protected进行修饰,故创造其子类
        List<Datapoint> datapoints = JSONArray.parseObject(jsonArray.toJSONString(),new TypeReference<ArrayList<Datapoint>>() {});
        System.out.println(datapoints);

        //方法二:使用Gson的思想
        List<Datapoint> datapoints1 = JSONArray.parseArray(jsonArray.toJSONString(),Datapoint.class);
        System.out.println();
    }

3 总结:

其实我们平时用到的也就是上面的这个方法,JSONObject,JSONArray两个类中的方法。想深入了解的话,可以看一下源码。但是源码基本上没有注释,所以看起来有点迷糊。但是只要深入研究,总能弄明白的。现在我只会使用这些常用的方法,希望后面有时间能够深入的取研究一下源码。



  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Fastjson阿里巴巴的一个开源的Java库,可以用于解析和生成JSON数据。解析复杂的JSON数据需要创建一个Java类来映射JSON数据的结构,然后使用Fastjson API将JSON字符串解析为Java对象。如果你想要解析一个复杂的JSON数据,你可以尝试如下方法: 1. 定义一个Java类来映射JSON数据的结构。每一个字段对应一个键值对。 2. 使用Fastjson的API,如parseObject,将JSON字符串解析为一个Java对象。 3. 使用解析后的Java对象访问数据。 代码示例: ``` String json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; //1. 定义一个Java类来映射JSON数据的结构 class User { private String name; private int age; private String city; //getters and setters } //2. 使用Fastjson的API,将JSON字符串解析为一个Java对象 User user = JSON.parseObject(json, User.class); //3. 使用解析后的Java对象访问数据 System.out.println(user.getName()); System.out.println(user.getAge()); System.out.println(user.getCity()); ``` ### 回答2: Fastjson是一个Java的解析JSON库,它快速、稳定、易用,可以处理各种复杂的JSON数据结构。Fastjson解析速度非常快,可以提高程序的性能,大大减少了JSON数据解析与Java对象转换的时间,利用了Java语言的强大性能优势,使得Fastjson成为了一款非常受欢迎的JSON解析库之一。 Fastjson可以快速处理各种JSON数据格式,包括对象、数组、字符串、数字等,可以轻松地将JSON数据转换为Java对象或Map,也可以将Java对象转换为JSON字符串。Fastjson采用的是基于Bean的转换,即将JSON数据转换为Java对象时,会根据JSON数据自动创建Java对象,并将JSON数据中的字段映射到Java对象中对应的属性中。 Fastjson可以解析复杂的JSON数据,例如包含嵌套对象和数组的JSON数据。Fastjson提供了很多高级的特性,例如自动类型识别、处理循环引用、支持序列化与反序列化、支持自定义序列化规则等,这些特性使得Fastjson在处理复杂JSON数据结构时更为灵活和可靠。 Fastjson还可以通过注解的方式来设置Java对象与JSON数据之间的映射规则,提高了程序的可维护性和可读性。通过注解可以自动设置Java属性与JSON字段之间的映射,也可以忽略不需要的属性,还可以自定义转换器来实现自定义的序列化与反序列化规则。 在实际开发中,Fastjson是一款非常实用的JSON解析库,它可以轻松地处理各种复杂的JSON数据结构,提高程序的性能和可维护性,方便开发人员快速地开发出高质量的应用程序。 ### 回答3: Fastjson是一种高效且易于使用的Java JSON解析框架。它可以帮助Java开发人员快速地将JSON数据转换为Java对象,同时保持数据的完整性和准确性。 Fastjson支持解析不同复杂度的JSON数据,如简单JSON对象,嵌套的JSON对象,数组和嵌套的数组。为了解析复杂JSON数据,Fastjson提供了几种重要的功能和API: 1. JSON对象和JSON数组 对于一个复杂的JSON数据,它可能包含许多嵌套的JSON对象和JSON数组。Fastjson提供了JSONObject和JSONArray类,可以帮助我们处理这些结构数据。我们可以使用getJSONObject()和getJSONArray()方法从JSONObject或JSONArray中获取子对象和子数组。 2.反序列化 反序列化是将JSON数据转换为Java对象的过程。Fastjson提供了一个JSON.parseObject()方法,可以将JSON字符串转换为Java对象。例如,我们可以使用下面的代码将一个复杂JSON字符串解析为一个Java对象: String jsonString = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\"}}"; Person person = JSON.parseObject(jsonString, Person.class); 3.注解 Fastjson提供了一些注解来帮助Java开发人员更灵活地控制对象的转换和序列化过程。例如,@JSONField注解可以指定JSON字段的名称和顺序,@JSONCreator注解可以指定一个特殊的构造函数,用于反序列化操作。 4.特殊对象转换器 有些复杂的JSON数据可能包含自定义的对象类型,无法直接通过Fastjson的默认转换器进行序列化和反序列化。Fastjson提供了ObjectSerializer和ObjectDeserializer接口,可以实现自定义的对象转换器。 总之,Fastjson是一种非常强大、稳定和易于使用的JSON框架,可以帮助Java开发人员快速高效地处理复杂和大数据量的JSON数据。它的灵活性和可定制性也让它成为许多企业级应用程序中首选的JSON解析库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值