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