Fastjson教程
将非字符串序列化为字符串

定义接口在日常开发中比较常见,定义接口的时候需要定义接口的请求参数和响应参数。 或许你会发现,有些接口定义的参数,几乎全部都是字符串类型。 接口参数定义为字符串类型有一些优点,例如参数类型变更时不需要修改接口定义、可以传递高精度的数值、在异构环境下兼容性更好等。 本篇内容基于Fastjson 1.2.62版本,马上开始学习吧。

默认序列化格式

首先,看一下默认序列化的情况。由于涉及的字段比较多,在序列化时启用了格式化输出SerializerFeature.PrettyFormat配置,序列化后的内容缩进格式化可读性更好。

    public class Data {
        public boolean bool = true;
        public byte b = 100;
        public char c = 'a';
        public short s = 101;
        public int i = 102;
        public long l = 103;
        public float f = 104.1F;
        public double d = 105.1D;
        public String str = "go";
    }
    
    /**
     * 格式化输出
     */
    @Test
    public void testPrettyFormat() {
        Data data = new Data();
        System.out.println(JSON.toJSONString(data, SerializerFeature.PrettyFormat));
    }

执行结果:

    {
        "b":100,
        "bool":true,
        "c":"a",
        "d":105.1,
        "f":104.1,
        "i":102,
        "l":103,
        "s":101,
        "str":"go"
    }

可以看到,整型数值、浮点类型数值和布尔类型等都按照原始的格式输出。

将基本类型字段值序列化为字符串

在调用序列化方法toJSONString的时候,传入SerializerFeature.WriteNonStringValueAsString配置项,将基本类型字段值序列化为字符串。

    /**
     * 将基本类型字段值序列化为字符串
     */
    @Test
    public void testWriteNonStringValue() {
        Data data = new Data();
        System.out.println(JSON.toJSONString(data, SerializerFeature.WriteNonStringValueAsString, SerializerFeature.PrettyFormat));
    }

执行结果:

    {
        "b":"100",
        "bool":"true",
        "c":"a",
        "d":"105.1",
        "f":"104.1",
        "i":"102",
        "l":"103",
        "s":"101",
        "str":"go"
    }

执行结果的各种类型的值,都变成了字符串。

将Map的值value序列化为字符串

将非字符串值序列化为字符串的特性,也支持Map集合类型。

    /**
     * 将Map的值序列化为字符串
     */
    @Test
    public void testMapNonStringValue() {
        Map<String, Object> map = new HashMap<>();
        map.put("sam", 26);
        map.put("fanny", 1);
        map.put("andy", "sing");
        map.put("wo", true);
        System.out.println(JSON.toJSONString(map, SerializerFeature.WriteNonStringValueAsString, SerializerFeature.PrettyFormat));
    }

执行结果:

    {
        "fanny":"1",
        "wo":"true",
        "sam":"26",
        "andy":"sing"
    }

将Map的键key序列化为字符串

同样的,该特性也可应用于Map的键。

    /**
     * 将Map的键和值都序列化为字符串
     */
    @Test
    public void testMapNonStringKeyValue() {
        Map<Object, Object> map = new HashMap<>();
        map.put("sam", 26);
        map.put(10, 1);
        map.put(true, "sing");
        map.put(12.3D, true);
        System.out.println(JSON.toJSONString(map, SerializerFeature.WriteNonStringKeyAsString,
                SerializerFeature.WriteNonStringValueAsString, SerializerFeature.PrettyFormat));
    }

执行结果:

    {"12.3":"true","10":"1",
        "sam":"26","true":"sing"
    }

执行结果符合预期,Map对象的键和值都序列化为字符串。 不过,格式化功能似乎还不够完善。

小结

Fastjson为序列化提供了许多配置项,用于满足各种应用场景。 如果希望将非字符串值,序列化为字符串,可以启用SerializerFeature.WriteNonStringValueAsString配置项来实现。 另外,如果想将该特性应用于Map的key,则需要启用SerializerFeature.WriteNonStringKeyAsString配置项。

参考

https://github.com/alibaba/fastjson (opens in a new tab)