java - 从父类(super class)覆盖 jackson @JsonValue

标签 java json jackson jackson-databind

我有一个接口(interface)(已经包含 Jackson 注释):

interface Interface {
    @JsonValue
    String fieldA();

    String fieldB();
}

我无法修改,以及实现此接口(interface)的类:

class Impl implements Interface {
    String fieldA;
    String fieldB;

    public Impl(String fieldA, String fieldB) {
        this.fieldA = fieldA;
        this.fieldB = fieldB;
    }

    @Override
    @JsonSerialize
    public String fieldA() {
        return fieldA;
    }

    @Override
    @JsonSerialize
    public String fieldB() {
        return fieldB;
    }
}

现在,当我序列化 Impl 类时,我希望生成的 Json 会同时存在两个字段(fieldAfieldB)。

事实并非如此:

@Test
void should_serialize_both_fields() throws JsonProcessingException {
    // Given
    ObjectMapper mapper = new ObjectMapper();
    Impl example = new Impl("test", "test");
    String expected = "{\"fieldA\": \"test\", \"fieldB\": \"test\"}";

    // When
    String json = mapper.writeValueAsString(example);

    // Then
    org.assertj.core.api.Assertions.assertThat(json).isEqualTo(expected);
}

在此测试中,生成的 json"test" 而不是 {"fieldA": "test", "fieldB": "test"}:

org.opentest4j.AssertionFailedError: 
Expecting:
 <""test"">
to be equal to:
 <"{"fieldA": "test", "fieldB": "test"}">
but was not.

问题来自于接口(interface)上已经存在的 @JsonValue 注释,我无法修改它。另外,如果我尝试在 Impl 中注释另一个方法,那么我会从 jackson 处得到此异常:

com.fasterxml.jackson.databind.JsonMappingException: Problem with definition of [AnnotedClass com.actility.m2m.commons.service.error.InternalErrorCodeImplTest$Impl]: Multiple 'as-value' properties defined ([method com.actility.m2m.commons.service.error.InternalErrorCodeImplTest$Impl#fieldB(0 params)] vs [method com.actility.m2m.commons.service.error.InternalErrorCodeImplTest$Impl#fieldA(0 params)])

有什么办法可以实现这一点吗?

最佳答案

访问the docs ,您应该能够在子类中设置“false”JSON 值:

Boolean argument is only used so that sub-classes can "disable" annotation if necessary.

我想这已经告诉了你需要知道的一切,但它看起来像这样:

class Impl implements Interface {
    //...

    @Override
    @JsonSerialize
    @JsonValue(false) //...disables inherited annotation
    public String fieldA() {
        return fieldA;
    }

    // ...
}

关于java - 从父类(super class)覆盖 jackson @JsonValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902667/

相关文章:

javascript - 如何在vue组件中导入js文件?

javascript - Laravel - 为什么json响应有时返回一个数组有时返回一个对象

json - Spring 3.2RC1 中来自 JodaTime 的 jackson2 JSON ISO 8601 日期

java - 继承变量上的@ConfigurationProperties

Java 通用列表 - 使用 Array.newInstance 导致 Nullpointer

java - Gwtbootstrap3。仅使用 java 代码引导组件 - 不使用 ui-binder

java - 在 Java 中使用循环创建变量名?

java - JSON 到 java.sql.timestamp 反序列化丢失了几个小时,导致日期丢失了一天

java - 我怎样才能让 jackson 不把我的类(class)当作 map ?

java - 如何使用 Jackson 解析具有可变对象名称的 JSON?