java - Jackson - 有什么方法可以避免在运行时父实体的序列化吗?

标签 java json jackson

假设我有两个简单的类

@JsonFilter("filter properties by name")
public class Foo
{
    private Integer id;
    private String name;
}

@JsonFilter("filter properties by name")
public class Bar
{
    private Integer id;
    private String name;
    private Foo foo;
}

我想序列化 Bar 的实例其中foo字段只有它的 id。这一切都应该在运行时完成。 我尝试使用过滤器来做到这一点

FilterProvider filter = new SimpleFilterProvider().addFilter(
            "filter properties by name", SimpleBeanPropertyFilter
                .serializeAllExcept(/*name of the field to exclude*/));
objectMapper.writer(filter).writeValuAsString(bar);

但是,这样做时,我必须手动排除父类的所有字段;另外,如果该字段之一与子类的字段同名,则它们都被排除。 在我的示例中,我无法排除字段 name以这种方式,因为它也会影响该领域name Bar的类。

那么,我怎样才能以最简洁/优雅的方式解决呢? 是否有类似于上面代码的东西,可能使用点符号或类似的东西?

例如到目前为止,在我的示例过滤器中,我可以编写类似 [...].serializeAllExcept("name", "foo")); 的内容,但很高兴拥有 [...].serializeAllExcept("foo.name"));或类似的。

最佳答案

您不需要任何过滤器。 Foo 和 Bar 类没有变化。

新的 MixInFoo 类:

public class MixInFoo {
    @JsonProperty("mixinFooId")
    private Integer id;
    @JsonIgnore
    private String name;

}

我更改了“id”属性名称只是为了说明您可以完全更改响应而无需修改原始 Foo 类。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.getSerializationConfig().addMixInAnnotations(Foo.class, MixInFoo.class);
objectMapper.getDeserializationConfig().addMixInAnnotations(Foo.class, MixInFoo.class);

String result = objectMapper.writeValueAsString(json);

您需要注册 MixIn 类,如图所示。

***** 基于过滤器的实现 **********

是的,您可以使用 Filter 来达到相同的结果。您需要将 @JsonFilter 添加到 Foo 类并将其命名为“FooFilter”。然后您可以添加仅适用于 Foo 类的 Filter:

@JsonFilter("FooFilter")
public class Foo {
    private Integer id;
    private String name;
}

public class Bar {
    private Integer id;
    private String name;
    private Foo foo;
}

public static void main(String []args) throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();

    String []fooIgnore = {"name"};
    SimpleBeanPropertyFilter propertyFilter = SimpleBeanPropertyFilter.serializeAllExcept(fooIgnore);
    FilterProvider filterProvider = new SimpleFilterProvider().addFilter("FooFilter", propertyFilter);

    ObjectWriter objectWriter = objectMapper.writer(filterProvider);
    String result = objectWriter.writeValueAsString(json);

    System.out.println(result);
}

在该实现中,您不需要扩展和实现自定义 SimpleBeanProvider 即可将过滤器仅应用于 Foo 类。

关于java - Jackson - 有什么方法可以避免在运行时父实体的序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27178461/

相关文章:

java - 使用Netty时如何处理连接或绑定(bind)异常

java - 尝试运行 Google 语音识别 java 示例时出现 "need path to queries.json"错误

json - 在 JSON 树数据库中存储聊天的最佳方式?

java - Jackson Json 到 POJO 的映射

java - 为什么改变 joinColumn 的顺序,hibernate 返回正确或不正确的查询?

java - Maven 无法通过 `mvn exec:java` 调用编译 java 代码 (java.lang.ClassNotFoundException)

java - Jackson 来自 kotlin 的自定义 json 序列化 java 原语

java - 使用jackson反序列化json以纠正子类类型

java - 如何将线程名称写入日志而不是 [p : default-threadpool; w: Idle]

java - 如何在解析 JSON 时找到父 Json 节点