美文网首页
Fastjson 简单上手

Fastjson 简单上手

作者: acc8226 | 来源:发表于2020-03-18 19:41 被阅读0次

fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。

功能完备: 支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。

下载 jar包 或者配置 maven 依赖:

<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.61</version> <!-- 2020年3月18号的最新版本  -->
    </dependency>
  </dependencies>

创建 JSONObject 对象

创建 JSON 对象非常简单,只需使用 JSONObject(fastJson提供的json对象) 和 JSONArray(fastJson提供json数组对象) 对象即可。

我们可以把JSONObject 当成一个 Map<String,Object> 来看,只是 JSONObject 提供了更为丰富便捷的方法,方便我们对于对象属性的操作。

  1. 直接构造
JSONObject json = new JSONObject();
json.put("aaa", "title");
json.put("bbb", 2);
json.put("ccc", new Object());
  1. 查看源码, 可知构造的时候传入 map
    // 源码
    public JSONObject(Map<String, Object> map){
        if (map == null) {
            throw new IllegalArgumentException("map is null.");
        }
        this.map = map;
    }
  1. JSON.parseObject 一系列方法
//从字符串解析JSON对象
JSONObject obj = JSON.parseObject("{\"title\":\"fastJson真的很快\"}");

创建 JSONArray 对象

同样我们可以把 JSONArray 当做一个 List<Object>,可以把 JSONArray 看成 JSONObject 对象的一个集合。

  1. 直接构造
JSONArray json = new JSONArray();
json.add("xxx");
  1. 查看源码, 可知构造的时候传入 list
    // 源码
    public JSONArray(List<Object> list){
        this.list = list;
    }
  1. JSON.parseArray 一系列方法
//从字符串解析JSON数组
JSONArray arr = JSON.parseArray("[\"一只兔子\",\"两只绵羊\"]\n");

对象转 json 串 (序列化)

com.alibaba.fastjson.JSON的静态方法, 适用于任意 Object 对象.包括JSONObject, JSONArray

String text = JSON.toJSONString(obj); //序列化

由于 JSONObject 和 JSONArray 都继承与JSON抽象类, 如果直接得到了 JSON 抽象类的子类, 可以直接toString 或者 toJSONString方法(两者等价)进行序列化.

String jsonString = jsonObject.toString());

String jsonArrayString = jsonArray.toJSONString();

序列化定制之 SerializerFeature

JSON.toJSONString 的一些定制功能

        // 按理输出为json串, 成员变为key, 为value, 但是现在只取值组成array
        System.out.println(JSON.toJSONString(person, SerializerFeature.BeanToArray));
        // WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
        System.out.println(JSON.toJSONString(new Person(18, null, null), SerializerFeature.WriteNullStringAsEmpty));
        // WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
        // WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
        // WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
        // WriteMapNullValue 是否输出值为null的字段, 默认策略是忽略,所以看不到为null的字段

序列化定制之SerializeFilter

NameFilter 对序列化后的参数名进行拦截处理。

Object process(Object object, String name, Object value);

这个过滤器是用来拦截最后确定序列化的参数名时被调用的。返回值为最终确认的参数名,如果不做处理,那就直接返回name。

ContextValueFilter 配置 JSON 转换
在某些场景下,对Value做过滤,需要获得所属JavaBean的信息,包括类型、字段、方法等。在fastjson-1.2.9中,提供了ContextValueFilter,类似于之前版本提供的ValueFilter,只是多了BeanContext参数可用。

package com.alibaba.fastjson.serializer;
public interface ContextValueFilter extends SerializeFilter {
    Object process(BeanContext context, 
           Object object, 
           String name, 
           Object value);
}

ValueFilter 对序列化后的value进行拦截处理。

String process(Object object, String name, Object value);

对于参数列表中三个参数都很好理解,第一个Object为现在被拦截参数的拥有者,第二个参数为其参数名,第三个参数为其参数值,其实这个地方重点要理解的是返回值。ValueFilter的作用是在序列化之前对一些参数值做一些后置处理。例如参数值的类型为Double,但是你想做精度控制并且返回值为String,这个ValueFilter就有很大作用了,如果不做处理,直接返回value就可以了。

json 串转对象 (反序列化)

VO vo = JSON.parseObject("{...}", VO.class); //反序列化

注意反序列化时为对象时,必须要有默认无参的构造函数,否则会报异常. 新版本不会报异常, 但是最好加上. 记住任何时候加空构造是个好习惯.

JSONField 类的说明

package com.alibaba.fastjson.annotation;

public @interface JSONField {
    // 配置序列化和反序列化的顺序,1.1.42版本之后才支持
    int ordinal() default 0;

     // 指定字段的名称
    String name() default "";

    // 指定字段的格式,对日期格式有用
    String format() default "";

    // 是否序列化
    boolean serialize() default true;

    // 是否反序列化
    boolean deserialize() default true;
}
  • JSONField 注解可作用与 Field 或者 方法上, 也可以是 Setter (用于反序列化)和 Getter(序列化) 方法.
  • 一个简单的使用就是 @JSONField(name = "abc"), 序列化和反序列话讲使用abc这个字段, 否则会使用成员变量的名字
    举例JSONField(name = "DATE OF BIRTH", format="yyyy-MM-dd HH:mm:ss", serialize = true, ordinal = 1)
  • JSONField 的 format 参数用于格式化 Date 类型。
// 配置date序列化和反序列使用yyyyMMdd日期格式
@JSONField(format="yyyy-MM-dd")
public Date date;
  • 默认情况下, FastJson 库可以序列化 Java bean 实体, 但我们可以使用 JSONField 的 serialize 指定字段不序列化。
  • 使用 JSONField 的 ordinal 参数指定字段的顺序. ordinal = 1表示排在第一列.

注意:FastJson 在进行操作时,是根据 getter 和 setter 的方法进行的,并不是依据 Field 进行。建议正常情况下选取注解field上即可. 不要两种都选取.
若属性是私有的,必须有 set 方法且set方法要书写正确。否则不会按照预期反序列化。得不到该值, 该值会为null.
get 用于序列化成字符串. 若属性是私有的, 必须有 set 方法且get方法要书写正确. 否则该字段会被忽略掉!!!

SerializeConfig

SerializeConfig:内部是个map容器主要功能是配置并记录每种Java类型对应的序列化类。
举例使用:

SerializeConfig.getGlobalInstance().addFilter(A.class, upcaseNameFilter);
public class ClassNameFilterTest extends TestCase {
    public void test_filter() throws Exception {
         NameFilter upcaseNameFilter = new NameFilter() {
            public String process(Object object, String name, Object value) {
                return name.toUpperCase();
        }
    };
        SerializeConfig.getGlobalInstance() //
               .addFilter(A.class, upcaseNameFilter);
        Assert.assertEquals("{\"ID\":0}", JSON.toJSONString(new A()));
        Assert.assertEquals("{\"id\":0}", JSON.toJSONString(new B()));
    }
    public static class A {
        public int id;
    }
    public static class B {
        public int id;
    }
}

fastjson 的一些用法

用 fastjson 实现克隆

JSON.parseObject(JSON.toJSONString(this), this.getClass());

将对象中的null赋值为""

Object object = xxx;
JSON.parseObject(JSON.toJSONString(object, SerializerFeature.WriteNullStringAsEmpty), object.getClass());

Fastjson的SerializerFeature序列化属性

QuoteFieldNames———-输出key时是否使用双引号,默认为true
WriteMapNullValue——–是否输出值为null的字段,默认为false
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

// 空对象转 {} 貌似目前没有好的方法实现

手敲的示例

package qy.likai.demo;

import java.util.*;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

/**
mvn compile
mvn exec:java -Dexec.mainClass="qy.likai.demo.App"
 */
public class App {
    public static void main( String[] args) {
        // 创建 JSONObject 对象
        JSONObject json = new JSONObject();
        json.put("aaa", "title");
        json.put("bbb", 2);
        json.put("ccc", 2.123);
        json.put("ddd", true);
        // 对 null 默认是不输出, 因为我猜无论何时反正getXXX 为 null吧
        json.put("eee", null);
        json.put("fff", new Object());
        json.put("ggg", new int[]{1, 2, 3});
        json.put("hhh", Collections.singletonList(666));
        json.put("iii", Collections.singletonMap("my", "myvalue"));
        // 直接输出
        System.out.println(json);

        // 创建 JSONArray 对象
        // JSONArray jsonArray = new JSONArray();


        // 序列化 形如: String text = JSON.toJSONString(obj);
        System.out.println(JSON.toJSONString(json));

        // 序列化也可以定制一特定的功能, 比如
        final Person person = new Person(18, "zhangsan", new Date());
        System.out.println(JSON.toJSONString(person));
        // 按理输出为json串, 成员变为key, 为value, 但是现在只取值组成array
        System.out.println(JSON.toJSONString(person, SerializerFeature.BeanToArray));
        // WriteNullStringAsEmpty 字符类型字段如果为null,输出为”“,而非null
        System.out.println(JSON.toJSONString(new Person(18, null, null), SerializerFeature.WriteNullStringAsEmpty));
        // WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null
        // WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null
        // WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null
        // WriteMapNullValue 是否输出值为null的字段, 默认策略是忽略,所以看不到为null的字段


        // 反序列化
        //从字符串解析JSON对象
        JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鸟教程\"}");
        //从字符串解析JSON数组
        JSONArray arr = JSON.parseArray("[\"菜鸟教程\",\"RUNOOB\"]\n");


        // json串 转 JSONObject对象
        Object object = JSON.parse(json.toJSONString());
        JSONObject jsonObject = (JSONObject)object;
        // 也可以使用 JSON.parseObject 一步到位

        // json 串转Java对象
        Person p = JSON.parseObject("{\"AGE\":18,\"FULL NAME\":\"zhangsan\",\"birthday\":\"2020-04-25 12:12:53\"}", Person.class);
        System.out.println(p);

        // json串(数组类型) 转jsonArray
        JSONArray jsonArray = JSON.parseArray("[1,2,3]");
        System.out.println(jsonArray);

        // json串(数组类型) 转list(需要传入已知类型)
        List<Integer> list = JSON.parseArray("[1,2,3]", Integer.class);
        System.out.println(list);
    }
}

参考

Fastjson 项目地址
https://github.com/alibaba/fastjson

Fastjson 简明教程
https://www.runoob.com/w3cnote/fastjson-intro.html

相关文章

  • Fastjson 简单上手

    fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为J...

  • FastJson快速上手

    FastJson快速上手 背景说明 FastJson是由阿里巴巴工程师基于JAVA开发的一款JSON解析器和生成器...

  • JSON转成List结构数据

    先要引入对应的jar,然后调用net.sf.json库的 fastjson的简单用法,fastjson转换相对语法...

  • fastjson简单应用

    1.引入相关maven依赖 2. fastjson使用实例 注:其中JSONObject使用和HashMap类似;...

  • fastJson

    用原生操作json的方法过于复杂,所以fastJSON库提供了更为简单的方法1 需要在项目中引入fastjson的...

  • FastJson使用范例(Java、Scala版)

    0.目录 FastJson简介 FastJson三个核心类 Maven Java API反序列化反序列化一个简单J...

  • FastJson的简单使用

    1.1.FastJson的介绍: JSON协议使用方便,越来越流行,JSON的处理器有很多,这里我介绍一下Fast...

  • FastJson-简单使用

    创建JSON对象 JSON字符串转换为java对象ATTENTION: class need default co...

  • 线上答题员招募啦,名额有限,赶紧上车

    简单易上手

  • App开发依赖

    下拉刷新(几乎包含所有View) 标签类控件 Lottie-Android动画实现更简单 FastJson 解析(...

网友评论

      本文标题:Fastjson 简单上手

      本文链接:https://www.haomeiwen.com/subject/exdcyhtx.html