我有这样的Jackson注释类:
public class MyClass {
String field1;
@JsonIgnore
String field2;
String field3;
@JsonIgnore
String field4;
}
假设我不能更改我的类代码。那么,如何让ObjectMapper只覆盖field2的JsonIgnore并将其序列化为json?但我希望它忽略field4。这很简单,只需要几行代码吗?
我的常规序列化代码:
public String toJson(SomeObject obj){
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = null;
try {
json = ow.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return json;
}
您可以使用自定义序列化程序,如下所示(重构由您决定):
private String getJson(final MyClass obj) {
final ObjectMapper om = new ObjectMapper();
om.registerModule(new SimpleModule(
"CustomModule",
Version.unknownVersion(),
Collections.emptyMap(),
Collections.singletonList(new StdSerializer<MyClass>(MyClass.class) {
@Override
public void serialize(final MyClass value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException {
jgen.writeStartObject();
jgen.writeStringField("field1", value.field1);
jgen.writeStringField("field2", value.field2);
jgen.writeStringField("field3", value.field3);
jgen.writeEndObject();
}
})));
try {
return om.writeValueAsString(obj);
} catch (final JsonProcessingException e) {
throw new RuntimeException(e);
}
}
你可以在google/stackoverflow上找到更多关于自定义序列化器的信息,我想我在这里回答了类似的问题
您可以使用MixIn
功能:
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonApp {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.addMixIn(MyClass.class, MyClassMixIn.class);
System.out.println(mapper.writeValueAsString(new MyClass()));
}
}
interface MyClassMixIn {
@JsonProperty
String getField2();
}
以上代码打印:
{
"field1" : "F1",
"field2" : "F2",
"field3" : "F3"
}
问题内容: 我知道如何在Jackson中使用自定义序列化程序(通过扩展),但是我希望默认序列化程序可用于除1个字段之外的所有字段,我想使用自定义序列化程序覆盖该字段。 注释不是一种选择,因为我正在序列化一个生成的类(来自Thrift)。 编写自定义杰克逊序列化程序时,如何仅指定要覆盖的某些字段? 更新: 这是我要序列化的类: 上面的类有很多特质,其中大多数使用本机类型。我只想覆盖自定义序列化程序中
问题内容: 我使用以下代码来序列化从外部服务获得的响应,并作为我的服务的一部分返回json响应。但是,当外部服务返回带有时区(10:30:00.000-05.00)的时间值时,杰克逊会将其转换为15:30:00。如何忽略时区值? 问题答案: 您可以创建自定义解串器 告诉杰克逊使用您的自定义解串器 并像这样使用它: 您可以使用Jackson自定义序列化为服务响应添加时区信息
我有一个这样的对象: 我是否可以使用和我的条件来仅在不为负数的情况下包含该值?或者有没有其他的解决办法我可以做到这一点?
如何告诉 Jackson ObjectMapper 从序列化中忽略特定类型(类)的字段的情况下)? 约束条件: 不控制源类-它是第三方类。 被序列化的类类型是未知的-我猜它取消了MixIn的资格。 此类字段的名称预先未知 为了提供帮助,下面是一个单元测试,期望从序列化中忽略字段和,但它的方法是不正确的,它是按名称而不是按类型过滤它们。
例如: 我知道有jackson注解可以这样做,但是我的字段已经用我的持久性注解进行了注解,所以我想避免重复,因为我已经有了我想忽略的注解的字段
在这种情况下,如果验证失败,我希望将请求返回给用户,并附上相应的错误消息。我遇到的问题是,我使用Jackson处理JSON请求,验证失败也会导致Jackson无法序列化消息。 例如,如果我有此对象: ...当我去序列化时,字段无效(假设它有11个字符)... ...我得到了一个JsonProcessingException(错误验证对象)。我已经确认一个有效的对象序列化没有问题。所以我的问题是:我