如果可以的话,一个选择是像这样更改您的示例类:
public static class Example {
private String value;
private String type;
@JsonIgnore
public String getValue() {
return value;
}
@JsonProperty("value")
@JsonRawValue
public Object getRawValue() {
if("String" .equals(type)){
return '"'+ value +'"';
}
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
或者您可以在 Example 类上使用反序列化器
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Example.class, new MySerializer());
mapper.registerModule(module);
System.out.println(mapper.writeValueAsString(list));
}
private static class MySerializer extends JsonSerializer<Example> {
@Override
public void serialize(Example value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeStartObject();
gen.writeFieldName("value");
if (value.getType().equals("String")) {
gen.writeString( value.getValue());
} else {
gen.writeRawValue(value.getValue());
}
gen.writeStringField("type", value.getType());
gen.writeEndObject();
}
}
结果:
[{"value":1234,"type":"Integer"},{"value":"example string","type":"String"},{"value":true,"type":"Boolean"}]
更新
这是您可以使用自定义反序列化器的一种方法,并为每个其他字段使用默认反序列化器:
private static class MySerializer extends JsonSerializer<Example> {
private static final ObjectMapper internalMapper = new ObjectMapper();
@Override
public void serialize(Example value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
ObjectNode node = internalMapper.valueToTree(value);
if (value.getType().equals("String")) {
node.put("value", value.getValue());
} else {
node.putRawValue("value", new RawValue(value.getValue()));
}
gen.writeObject(node);
}
}
您的public String getValue() 中需要有@JsonIgnore