首页 > 解决方案 > 将格式错误的 JSON 列表解析为对象:使用 Java 解析的最佳实践

问题描述

因此,我使用来自格式错误的 REST 端点(我无权访问)的数据。

特别是,我收到一个实际上是一个列表的 json 对象。处理这个问题的最佳方法是什么?杰克逊能做到吗?

{
    "list": {
        "element 31012991428": {
            "objId": 31012991428,
            "color": "green"
        },
        "element 31012991444": {
            "objId": 31012991444,
            "color": "orange"
        },
        "element 3101298983": {
            "objId": 3101298983,
            "color": "red"
        },
    }
}

理想情况下,我希望能够按如下方式解析它:

响应.java

public class GetSucherResponse {
    @JsonProperty("elements") //what goes here?
    private List<Element> elements;
}

元素.java

public class Element {
    @JsonProperty("objId")
    private Long objId;
    @JsonProperty("color")
    private String color;
}

标签: javajsonjackson

解决方案


创建了一个粗略的解决方案
响应类应该如下所示:

@JsonDeserialize(using = ResponseDeserializer.class)
public class Response {
    private List<Element> elements;
    public Response(List<Element> elements) {
        this.elements = elements;
    }
}

解串器:

public class ResponseDeserializer extends StdDeserializer<Response> {

    protected ResponseDeserializer() {
        super(Response.class);
    }

    @Override
    public Response deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
        TreeNode rootNode = jsonParser.getCodec().readTree(jsonParser);
        TreeNode listNode = rootNode.get("list");
        List<Element> elements = new ArrayList<>(listNode.size());
        listNode.fieldNames().forEachRemaining(
                s -> elements.add(parseElement(jsonParser, listNode.get(s)))
        );
        return new Response(elements);
    }

    private Element parseElement(JsonParser jsonParser, TreeNode subNode) {
        Element element = null;
        try {
            element = jsonParser.getCodec().treeToValue(subNode, Element.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace(); //TODO handle it in a better way
        }
        return element;
    }

}

推荐阅读