从Java以编程方式访问@JsonProperty

时间:2018-11-26 16:34:28

标签: java jackson

我在引擎盖下使用Immutables + Jackson进行以下POJO:

@JsonInclude(JsonInclude.Include.NON_NULL)
abstract class AbstractQueryRequest {
    @JsonProperty("reqid")
    public abstract String reqid();

    @JsonProperty("rawquery")
    public abstract String rawquery();
}

在某个时候,我需要基于POJO的字段构建另一个对象,类似于以下内容:

    final HttpUrl.Builder urlBuilder = HttpUrl.parse(cfg.baseUrl()).newBuilder();
    urlBuilder.addQueryParameter("reqid", request.reqid())
            .addQueryParameter("rawquery", request.rawquery());

保持POJO和此调用根据更改对齐是很烦人的,我想知道是否可以通过编程方式访问每个JsonProperty而不是手动键入字符串。

请注意,手工编写getter很好,因为我可以轻松地进行重构,并且可以对编译器进行双重检查,但是对于字符串,我担心下层人士,我想从POJO中“读取”它们上课。

1 个答案:

答案 0 :(得分:2)

您可以通过反射来完成。您需要采用用 JsonProperty 进行注释的方法注释值。但是我建议您在字段而不是方法上使用JsonProperty。

以下是您当前要求的一个示例:

public class Main {
    public static void main(String[] args) {

        AbstractQueryRequest someType = new SomeType();

        for(Method method : x.getClass().getSuperclass().getDeclaredMethods()) {
            if (method.isAnnotationPresent(JsonProperty.class)) {
                JsonProperty annotation = method.getAnnotation(JsonProperty.class);
                System.out.println(annotation.value());
            }
        }
    }
}


class SomeType extends AbstractQueryRequest {

    @Override
    public String reqid() {
        return null;
    }

    @Override
    public String rawquery() {
        return null;
    }
}

输出为:

rawquery
reqid