0

我有看起来像这样的数据

{
    "status": "success",
    "data": {
        "data1": {
            "serialNumber": "abc123",
            "version": "1.6"
        },
        "data2": {
            "irrelvent": [
                "irrelvent",
                "irrelvent"
            ]
        },
        "data3": {
            "irrelevantLibs": {
                "irrelevantFiles": [
                    "irrelevant.jar",
                    "irrelevant.jar",
                    "irrelevant.jar"
                ]
            }
        },
        "data4": {
            "configuration": "auth"
        }
    }
}

我正在使用杰克逊 JSON 处理器。我需要在data对象下做的是将每个提取data(x)到它自己的数据中。

很难解释,但我会尽量详细。我的目的是使 JSON 数据对我们的客户更具可读性。因此,我试图通过将每个data(x)对象拆分为网站上的块/表来使 JSON 数据更加友好。所以data1会独立显示。然后data2会独立显示等等。所以在这种情况下,我有四个data(x)对象,我想将这四个对象存储到四个不同的对象中Strings,然后根据需要显示它们。我的问题是如何让杰克逊处理器做到这一点?

不确定这是否有帮助,但我当前处理 JSON 数据的 JSON 函数是这样的:

public static String stringify(Object o) {
    try {
        ObjectMapper mapper = new ObjectMapper();
        DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
        printer.indentArraysWith(new Lf2SpacesIndenter());
        return mapper.writer(printer).writeValueAsString(o);
    } catch (Exception e) {
        return null;
    }
}

我很肯定我可以操纵处理器来分离这些数据,但我不知道从哪里开始。

编辑:嗯,因为杰克逊似乎是一个很难使用的解析器,如果我使用 Javascript JSON 解析器只提取data对象会更容易吗?由于我已经让 Jackson 将 JSON 数据转换为字符串,因此使用 Javascript 可以吗?

4

2 回答 2

0

因此,在真正深入研究文档后,我能够弄清楚。我必须使用JsonNode才能提取我想要的东西。请注意,该变量appName只是为了让我轻松显示字符串data(x),而iteNode只是下面的所有元素data(x)

public static List<String> jsonSplit(String o) throws JsonParseException, JsonMappingException, IOException {
    List<String> list = new ArrayList<String>();
    ObjectMapper mapper = new ObjectMapper();
    DefaultPrettyPrinter printer = new DefaultPrettyPrinter();
    printer.indentArraysWith(new Lf2SpacesIndenter());

    JsonNode rootNode = mapper.readValue(o, JsonNode.class); 
    Iterator<String> appName = rootNode.get("data").getFieldNames();
    Iterator<JsonNode> iteNode = rootNode.get("data").getElements();

    while (iteNode.hasNext()){
        list.add(appName.next());
        list.add(mapper.writer(printer).writeValueAsString(iteNode.next()));
    }

    return list;
}
于 2013-07-09T20:25:24.323 回答
0

“嗯,因为 Jackson 似乎是一个很难使用的解析器,如果我使用 Javascript JSON 解析器只提取数据对象会更容易吗?”

看到您正在使用 Java,您是否考虑过使用 Sling?http://sling.apache.org/它是一个外部库,可以让您非常快速地解析和探索 JSON 数据结构,最重要的是干净利落。

于 2013-07-08T23:35:23.907 回答