【问题标题】:Parse unnamed mappings in JSON using Jackson使用 Jackson 解析 JSON 中的未命名映射
【发布时间】:2012-12-13 19:35:28
【问题描述】:

我有一些以下格式的 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;
    }
}

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

【问题讨论】:

    标签: json parsing jackson


    【解决方案1】:

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

    如果你在那个类中确实需要它,你可以简单地通过一个 setter 来设置它,而不是把它传递给构造函数。

    或者,您也许可以利用第三个类来处理响应的实际映射,该映射使用 Response 对象(这反过来又会使用已从中删除 Map 的 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;     
        }
    }
    

    【讨论】:

    • 感谢您的回复,但不确定我是否理解这与解析我使用 Jackson 包含的 JSON 样本有何关系?我还需要 ResponseInner 中的 stringToFieldInfoMap,这只是我的代码的摘录。
    • @user654703 问题似乎是您当前有一个参数要传递给@JsonCreator 带注释的构造函数,该构造函数仅适用于单个参数方法签名。我建议在实例化后将stringToFieldInfoMap 传递给InnerResponse 类,或者重构类结构。
    • 我尝试更改代码以手动解析 stringToFieldInfoMap 以便我可以检测到字符串为“正确拼写”且 fieldInfo 实际上是布尔值但我不知道如何从 JSON 对象解析 FieldInfo(无法识别“field5”)。但听起来您的建议略有不同 - 您能否包含一个代码示例来说明?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多