Code: Select all
// First approach: using objectMapper.readTree
public String retrieve(String jsonPayload, String field) {
return objectMapper.readTree(jsonPayload).get(field).asText();
}
// Second approach: using Jackson's low level streaming API, JsonParser
public String retrieve(String jsonPayload, String field) {
try (JsonParser parser = objectMapper.createParser(jsonPayload)){
while (parser.nextValue() != null) {
if (field.equals(parser.currentName())) {
return parser.getText();
}
}
}
}
< /code>
Meine anfängliche Hypothese war, dass der zweite Ansatz leistungsfähiger wäre, basierend auf den folgenden Prämissen < /strong>: < /p>
[list]
[*] JsonParser muss nicht das Ganze zurückkehren und kann früh zurückkehren. Speicher < /li>
< /ul>
, aber dies zeigte nicht, dass es wahr ist. Ich habe einige Tests durchgeführt, um die Leistung beider Ansätze in Bezug auf verstrichene Zeit und Speicherverbrauch zu vergleichen. Ich habe einen JSON mit über ~ 450.000 Einträgen als Eingabe verwendet, was etwa 30 MB Daten entspricht. Dann führe ich mehrere Iterationen aus, die zufällige Eigenschaften von solchen JSONs abrufen. Auf den ersten Blick war das überraschend, aber ich denke, es gibt einige Möglichkeiten, es zu erklären. < /P>
readTree
[*] JsonParser verurteilt frühere Elemente nicht, was den Speicherverbrauch mit dem ReadTree -Leser immer noch laden lässt. Klassen. ReadTree tut nichts davon, daher bringt es eine gute Leistung
[/list]
Also scheint es, dass JsonParser nicht der richtige Weg ist, zumindest nicht so, wie ich es bisher ausprobiert habe. Was die Frage verlässt: Ist ReadTree () der schnellste Weg, JSON -Untergruppen mit Jackson zu extrahieren, oder gibt es bessere Optionen?