自定义 BigInteger JSON 序列化程序
Custom BigInteger JSON serializer
我正在尝试实现自定义 JSON 序列化程序 class 以在 JSON 响应中将对象 BigInteger
值显示为字符串。
我已经实现了自定义序列化程序 class
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
值总是没有参数构造函数,甚至像 this(BigInteger.class)
不使用我的方法并打印 null
.
你需要告诉 Jackson 它应该使用你的序列化器
即使是空值。您可以使用 @JsonSerializer
还带有 nullsUsing
参数。
在您的 MyObject class 中它看起来像这样:
@JsonSerialize(using = CustomCounterSerializer.class,
nullsUsing = CustomCounterSerializer.class)
private BigInteger nullValue;
我正在尝试实现自定义 JSON 序列化程序 class 以在 JSON 响应中将对象 BigInteger
值显示为字符串。
我已经实现了自定义序列化程序 class
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
值总是没有参数构造函数,甚至像 this(BigInteger.class)
不使用我的方法并打印 null
.
你需要告诉 Jackson 它应该使用你的序列化器
即使是空值。您可以使用 @JsonSerializer
还带有 nullsUsing
参数。
在您的 MyObject class 中它看起来像这样:
@JsonSerialize(using = CustomCounterSerializer.class,
nullsUsing = CustomCounterSerializer.class)
private BigInteger nullValue;