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

使用Jackson解析JSON中的未命名映射,json,parsing,jackson,Json,Parsing,Jackson,我有一些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

我有一些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”(我们称之为ResponseInner),另一个对象来表示包含字段的对象(我们称之为FieldInfo)但是我不知道如何使用@JsonCreator和@JsonProperty注释解析它-ResponseInner对象可以包含任意数量的String->FieldInfo映射

我试着这样解析它-

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;
    }
}
公共类响应{
私人应答器应答器应答器;
@JsonCreator
公共响应(@JsonProperty(“Response_inner”)ResponseInner ResponseInner){
this.reponseInner=responseInner;
}
}
公共类应答器{
私有地图StringToFieldInfo地图;
专用布尔应答器;
@JsonCreator
公共ResponseInner(映射stringToFieldInfoMap,@JsonProperty(“response\u inner\u bool”)布尔responseInerbool){
this.stringToFieldInfoMap=stringToFieldInfoMap;
this.responseInerbool=responseInerbool;
}
}

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

无论如何,您似乎没有在ResponseInner中使用
stringToFieldInfoMap
。为什么需要将其作为参数传递

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

或者,您也可以使用第三个类来处理响应的实际映射,该类使用响应对象(这将反过来使用已从中删除映射的ResponseInner对象)。这实际上允许您将映射逻辑与响应逻辑解耦

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;     
    }
}
公共类映射响应{
私有地图StringToFieldInfo地图;
私人回应;
公共MappedResponse(映射StringToFieldInfo映射,响应){
this.stringToFieldInfoMap=stringToFieldInfoMap;
这个。反应=反应;
}
}

感谢您的回复,但我不知道这与使用Jackson解析我包含的JSON示例有什么关系?此外,我确实需要stringToFieldInfoMap来响应Inner,这只是我代码的一个摘录。@user654703问题似乎是您当前有一个参数要传递到@JsonCreator注释构造函数中,该构造函数只能使用单个参数方法签名。我建议在实例化之后将
stringToFieldInfoMap
传递给
InnerResponse
类,或者重构类结构。我尝试更改代码以手动解析stringToFieldInfoMap,这样我就可以检测到当字符串被“correctlySpelled”并且fieldInfo实际上是布尔值时的情况,但是我不确定如何从JSON对象解析fieldInfo(无法识别“field5”)。但听起来你的建议有点不同-你能提供一个代码示例来说明吗?