Da es noch niemand erwähnt hat, hier ein Lösungsansatz mit Nashorn (JavaScript-Laufzeitteil von Java 8, aber veraltet in Java 11).
Lösung
private static final String EXTRACTOR_SCRIPT =
"var fun = function(raw) { " +
"var json = JSON.parse(raw); " +
"return [json.pageInfo.pageName, json.pageInfo.pagePic, json.posts[0].post_id];};";
public void run() throws ScriptException, NoSuchMethodException {
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval(EXTRACTOR_SCRIPT);
Invocable invocable = (Invocable) engine;
JSObject result = (JSObject) invocable.invokeFunction("fun", JSON);
result.values().forEach(e -> System.out.println(e));
}
Leistungsvergleich
Ich habe JSON-Inhalte geschrieben, die drei Arrays mit jeweils 20, 20 und 100 Elementen enthalten. Ich möchte nur die 100 Elemente aus dem dritten Array abrufen. Ich verwende die folgende JavaScript-Funktion zum Parsen und Abrufen meiner Einträge.
var fun = function(raw) {JSON.parse(raw).entries};
Den Aufruf eine Million Mal mit Nashorn dauert 7,5~7,8 Sekunden
(JSObject) invocable.invokeFunction("fun", json);
org.json dauert 20~21 Sekunden
new JSONObject(JSON).getJSONArray("entries");
Jackson dauert 6,5~7 Sekunden
mapper.readValue(JSON, Entries.class).getEntries();
In diesem Fall schneidet Jackson besser ab als Nashorn, das wiederum viel besser abschneidet als org.json. Die Nashorn-API ist schwieriger zu benutzen als die von org.json oder Jackson. Abhängig von Ihren Anforderungen können sowohl Jackson als auch Nashorn praktikable Lösungen sein.