自从我 Java + JSON 的第一天起,我就试图提取 JSON 的某些部分。
但不管我使用的是哪个库:
永远不可能让它快速舒适。主要用于简单的任务甚至原型设计。这已经花了我很多小时的不同方法。
通过 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");
这是脏代码的原因。它显示了有多少早期方法,以及有多少人无法及早实现它。
JSON 是一种简单的格式。但是使用这样的库是非常困难的,并且通常是初学者的问题。我通过 Google 甚至 StackOverflow 找到了几个不同的答案。但大多数都是相当大的,需要为整个 JSON - 对象创建一个自己的特定类。
使初学者更友好的最佳方法是什么?
或
什么是最适合初学者的方法?
答案 0 :(得分:0)
我通过研究发现的一个小助手是像在线工具
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"));