作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 spring boot 和 jackson 来提供 API。在我的数据库中有一个泛化/特化字段。这意味着,我有两个字段:一个值和一个定义该值的数据类型的字段。
所以我的实体看起来像这样:
public class Example{
private String value;
private String type;
// getters and setters
}
例如,这三个条目:
"1234";"Integer"
"example string";"String"
"true";"Boolean"
jackson 将其序列化如下:
[{
"value": "1234",
"type": "Integer"
},
{
"value": "example string",
"type": "String"
},
{
"value": "true",
"type": "Boolean"
}]
这就是我所期望的,但是,我需要这个:
[{
"value": 1234,
"type": "Integer"
},
{
"value": "example string",
"type": "String"
},
{
"value": true,
"type": "Boolean"
}]
因此,这些值应该根据“type”字段的值进行序列化。我知道我可以将序列化器附加到“值”字段,但我无法访问那里的“类型”字段以了解如何序列化该值。
最佳答案
如果可以的话,一个选择是像这样更改示例类:
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
关于java - Jackson:序列化 EER 特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37274563/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!