【发布时间】:2019-05-07 21:54:57
【问题描述】:
我正在尝试实现自定义 JSON 序列化程序类以在 JSON 响应中将对象 BigInteger 值显示为字符串。
我已经实现了一个自定义序列化程序类
public class CustomCounterSerializer extends StdSerializer<BigInteger> {
private static final long serialVersionUID = 5440920327083673598L;
public CustomCounterSerializer() {
this(BigInteger.class);
}
public CustomCounterSerializer(Class<BigInteger> vc) {
super(vc);
}
@Override
public void serialize(BigInteger value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException {
BigInteger valueJson = value==null ? BigInteger.valueOf(0) : value;
jsonGenerator.writeString(valueJson.toString());
}
}
我遇到的问题是我想使用重写的方法处理 null 对象值并将 0 传递给 JSON 字符串而不是 null。
我为此编写了一个 JUnit 测试:
public class CustomCounterSerializerTest {
private ObjectMapper objectMapper = new ObjectMapper();
@After
public void tearDown() {
objectMapper = null;
}
@Test
public void testCustomSerializerWithNullValues() throws JsonParseException, JsonMappingException, IOException {
MyObject obj = new MyObject();
obj.setNonNullValue(BigInteger.valueOf(1);
String obj_ = objectMapper.writeValueAsString(obj);
assertThat(obj_).isNotNull();
assertTrue(obj_.contains("\"nonNullValue\":\"" + BigInteger.valueOf(1).toString() + "\",\"nullValue\":\""+ BigInteger.valueOf(0).toString() +"\""));
}
}
失败,因为它包含 null 而不是 nullValue:"0"。
但是对象的 null 值总是没有 args 构造函数,甚至像 this(BigInteger.class) 一样不使用我的方法并打印 null。
【问题讨论】:
-
旁注:您不应该假设字段按特定顺序序列化。
-
我正在使用@JsonSerialize 并将类指定为该属性的序列化程序。我不假设顺序。我想要根据值的行为。
-
您的断言在
nullValue之前需要nonNullValue。
标签: java spring jackson objectmapper