从Java中的大型JSON中提取一行

时间:2015-11-03 16:31:29

标签: java json oop jackson deserialization

自从我 Java + JSON 的第一天起,我就试图提取 JSON 的某些部分。

但不管我使用的是哪个库:

  • GSON
  • JS​​ON-简单
  • javax.json

永远不可能让它快速舒适。主要用于简单的任务甚至原型设计。这已经花了我很多小时的不同方法。

  1. 通过 JSON

    的层次结构
    Object jsonObject = gson.fromJson(output, Object.class);
    JsonElement jsonTree = gson.toJsonTree(jsonObject);
    JsonArray commitList = jsonTree.getAsJsonArray();
    JsonElement firstElement = commitList.get(0);
    JsonObject firstElementObj = firstElement.getAsJsonObject();
    System.out.println(firstElementObj.get("sha"));
    JsonElement fileList = firstElementObj.get("files");
    
  2. 这是脏代码的原因。它显示了有多少早期方法,以及有多少人无法及早实现它。

    1. JSON 反序列化为 Java 对象
      您必须分析完整的 JSON 以创建完整的 Java - 对象表示,以便访问它的某些单个成员。这是我从未想过为原型设计做的一种方式


    2. JSON 是一种简单的格式。但是使用这样的库是非常困难的,并且通常是初学者的问题。我通过 Google 甚至 StackOverflow 找到了几个不同的答案。但大多数都是相当大的,需要为整个 JSON - 对象创建一个自己的特定类。

      使初学者更友好的最佳方法是什么? 或
      什么是最适合初学者的方法?

3 个答案:

答案 0 :(得分:0)

从JSON或JSON-Schema生成普通旧Java对象

我通过研究发现的一个小助手是像在线工具 http://www.jsonschema2pojo.org/

当你知道这一点时,这有点帮助。但我在第2点提到的消极方面仍然存在。

答案 1 :(得分:0)

使用Jackson(您标记的),您可以使用JsonPointer表达式浏览树对象:

    ObjectMapper mapper = new ObjectMapper();
    JsonNode tree = mapper
            .readTree("[ { \"sha\": \"foo\", \"files\": [ { \"sha\": \"bar\" }, { \"sha\": \"quux\" } ] } ]");
    System.out.println(tree.at("/0/sha").asText());
    for (JsonNode file : tree.at("/0/files")) {
        System.out.println(file.get("sha").asText());
    }

如果你想开始使用它,你也可以使用ObjectMapper将树的一部分转换为模型对象:

    for (JsonNode fileNode : tree.at("/0/files")) {
        FileInfo fileInfo = mapper.convertValue(fileNode, FileInfo.class);
        System.out.println(fileInfo.sha);
    }

如果您的目标类(FileInfo)指定忽略未知属性(使用@JsonIgnoreProperties(ignoreUnknown = true)注释目标类或在映射器上禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES),那么您只需声明您感兴趣的属性。< / p>

“最佳”是让你前进的任何方法。

答案 2 :(得分:0)

您可以使用JsonSurfer从流式JsonPath处理器中选择性地从大json中提取值或对象。

JsonSurfer jsonSurfer = JsonSurfer.gson();
System.out.println(jsonSurfer.collectOne(json, "$[0].sha"));
System.out.println(jsonSurfer.collectOne(json, "$[0].files"));