提问者:小点点

使用Jackson解析JSON中的未命名映射


我有一些以下格式的JSON,我试图与Jackson解析-

"response":{
"response_inner":{
"a":{"field1":2,"field2":0,"field3":5,"field4":0,"field5":[{"field5_1":"b","field5_2":1},{"field5_1":"c","field5_2":1}]},
"d":{"field1":2,"field2":6,"field3":11,"field4":0,"field5":[{"field5_1":"c","field5_2":1},{"field5_1":"b","field5_2":1}]},
"response_inner_bool":false
}
}

这里“a”、“b”等是一些可以在每个响应中更改的字符串。

我已经创建了一个Java对象来表示'response_inner'(让我们将其称为响应内部),另一个对象来表示包含字段的对象?s(让我们将其称为FieldInfo),但我不确定如何使用@JsonCreator和@JsonProperty注释来解析它-响应内部对象可以包含任意数量的字符串-

我试着这样解析它-

public class Response {
    private ResponseInner responseInner;

    @JsonCreator
    public Response(@JsonProperty("response_inner") ResponseInner responseInner) {
        this.reponseInner = responseInner;
    }
}

public class ResponseInner {
    private Map<String, FieldInfo> stringToFieldInfoMap;
    private boolean responseInnerBool;

    @JsonCreator
    public ResponseInner(Map<String, FieldInfo> stringToFieldInfoMap, @JsonProperty("response_inner_bool") boolean responseInnerBool ) {
        this.stringToFieldInfoMap = stringToFieldInfoMap;
        this.responseInnerBool = responseInnerBool;
    }
}

但它抱怨构造函数的参数#0没有属性名称注释;当多参数构造函数注释为Creator时,必须有名称。如何解决这个问题有什么建议吗?


共1个答案

匿名用户

无论如何,您似乎并没有在响应内部使用stringToFieldInfoMap。为什么需要将其作为参数传递?

如果您在该类中确实需要它,您可以简单地通过setter设置它,而不是将其传递给构造函数。

或者,您可以使用第三个类来处理响应的实际映射,该类使用Response对象(这反过来又会使用已从其中删除Map的Response seIn对象)。这实际上可能允许您将映射逻辑与响应逻辑分离。

public class MappedResponse {
    private Map<String, FieldInfo> stringToFieldInfoMap;
    private Response response;

    public MappedResponse(Map<String, FieldInfo> stringToFieldInfoMap, Response response) {
        this.stringToFieldInfoMap = stringToFieldInfoMap;
        this.response = response;     
    }
}