【问题标题】:Jackson - Recursive parsing into Map<String, Object>Jackson - 递归解析为 Map<String, Object>
【发布时间】:2012-12-04 15:54:06
【问题描述】:

我正在尝试简化我的代码:我想存储键和值(所有字符串)。

我实际上使用Map&lt;String, Object&gt; 来存储它。 Object 可以是一个值 (String) 或一个新节点 (Map&lt;String, Object&gt;)。

如何简化此代码? 递归函数会很好。

try {
    JsonParser jsonParser = new JsonFactory().createJsonParser(content);

    jsonParser.nextToken();
    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
        jsonParser.nextToken();

        if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                String key = jsonParser.getCurrentName();
                jsonParser.nextToken();

                if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
                    mData.put(key, new HashMap<String, Object>());
                    while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                        String subkey = jsonParser.getCurrentName();
                        jsonParser.nextToken();

                        if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) {
                            Map<String, Object> subdata = (Map<String, Object>) mData.get(key);
                            subdata.put(subkey, new HashMap<String, Object>());
                            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
                                String subsubkey = jsonParser.getCurrentName();
                                jsonParser.nextToken();
                                Map<String, Object> subsubdata = (Map<String, Object>) subdata.get(subkey);
                                LogHelper.d("data[" + key + "][" + subkey + "][" + subsubkey + "]=" + jsonParser.getText());
                                subsubdata.put(subsubkey, jsonParser.getText());
                            }
                        }
                        else {
                            LogHelper.d("data[" + key + "]=" + jsonParser.getText());
                            mData.put(key, jsonParser.getText());
                        }
                    }
                }
                else {
                    LogHelper.d("data[" + key + "]=" + jsonParser.getText());
                    mData.put(key, jsonParser.getText());
                }
            }
        }
        else {
            LogHelper.d("status=" + jsonParser.getText());
            mStatus = jsonParser.getText();
        }
    }
}
catch (IllegalArgumentException e) {
    error("0", "IllegalArgumentException: " + e.getMessage());
}
catch (JsonParseException e) {
    error("0", "IOException: " + e.getMessage());
}
catch (IOException e) {
    error("0", "IOException: " + e.getMessage());
}

【问题讨论】:

    标签: java json parsing jackson


    【解决方案1】:

    假设您的最终目标只是将 JSON 反序列化为 Map&lt;String, Object&gt;,那么使用 Jackson 可以更简单地执行此操作。使用ObjectMapper

    final String json = "{}";
    final ObjectMapper mapper = new ObjectMapper();
    final MapType type = mapper.getTypeFactory().constructMapType(
        Map.class, String.class, Object.class);
    final Map<String, Object> data = mapper.readValue(json, type);
    

    您将需要错误处理等,但这是一个很好的起点。

    【讨论】:

    • 确实,使用jackson-corejackson-mapper 库使您的代码只需要3 行代码!谢谢!
    • 如果有人找到了这个答案并且对此感到好奇:要让它反过来工作,你可以使用String json = new ObjectMapper().writeValueAsString(data)。在我的情况下,我有一个来自 API 网关的 Map&lt;String, Object&gt;,需要类似 String jsonan ApiGatewayResponse(包含这样的字符串)的东西。
    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    • 2013-05-24
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多