【问题标题】:Jackson two classes issue杰克逊两班问题
【发布时间】:2020-12-04 16:59:30
【问题描述】:

我的代码正在运行,一切都很好,但令我困扰的是,对于每一个响应,我都有两个类。

这就是 json 的样子,有一个主对象,它的响应对象总是不同的。

object{
...
...
response{
...
...
}
}

这里是带有属性的类,所以当有身份验证操作 api 调用时,我会得到一个对象,里面有另一个响应,它将显示下面提到的信息(accountID,authToken)

public class AuthResponse implements IResponse {

    @JsonProperty
    private String accountID;
    @JsonProperty
    private String authToken;

   // IResponse just have a validation method
}

这是一个带有 AuthResponse 的包装器,称为响应,以便杰克逊可以找到它

public class NowOSAuthResponse extends NowOSResponse {

    @JsonProperty
    private AuthResponse response;

    //can be replaced with @Getter
    @Override
    public IResponse getResponse() {
        return response;
    }
}

最后这里是包含抽象接口的主要对象,因此每个响应都有自己的返回对象

public abstract class NowOSResponse {

    @JsonProperty
    private String version;
    @JsonProperty
    private String operation;
    @JsonProperty
    private String status;

    public abstract IResponse getResponse();

所以我想知道是否有办法在不创建两个类的情况下返回响应对象。提前谢谢你

【问题讨论】:

    标签: java jackson jackson-databind


    【解决方案1】:

    也许这段代码可以帮助你:

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode root = mapper.createObjectNode();
        root.putPOJO("response", Map.of("accountID", "id", "authToken", "token"));
        root.put("version", "v1");
    
        mapper.writer().writeValue(bos, root);
        System.out.println(new String(bos.toByteArray(), StandardCharsets.UTF_8));
    

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectMapper mapper = new ObjectMapper();
        ObjectNode root = mapper.createObjectNode();
        var response = Map.of("response", Map.of("accountID", "id", "authToken", "token"), "version", "v1");
    
        mapper.writer().writeValue(bos, response);
        System.out.println(new String(bos.toByteArray(), StandardCharsets.UTF_8));
    

    输出:{"response":{"authToken":"token","accountID":"id"},"version":"v1"}

    【讨论】:

    • 嗯,这可能可行,但这需要 ObjectMapper 和一些代码行,但这是个好主意,也许杰克逊有一些注释或其他东西可以让它变得容易,而不是那些行,谢谢你的热情
    • 您可以使用所有字段创建一个地图,然后您可以直接序列化地图查看我的更新答案
    猜你喜欢
    • 2016-05-15
    • 2020-12-24
    • 2019-04-16
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多