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


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

留下评论