Прежде всего вы должны использовать только FasterXML
зависимости. Удалить все codehaus
зависимости. Когда вы читаете JSON
и вам нужен только один или несколько элементов, вы можете прочитать JSON
как JsonNode
и пройти его как дерево. Для ускорения обхода вы можете использовать paths
: /response/GeoObjectCollection/featureMember
для поиска массива featureMember
и /GeoObject/metaDataProperty/GeocoderMetaData/Address/Components
для поиска массива Components
в каждом элементе featureMember
. Смотрите приложение ниже, чтобы узнать все детали:
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(jsonFile);
GeoObjectWalker walker = new GeoObjectWalker(root);
List<String> countries = Arrays.asList("Germany", "United States of America", "Austria", "Belgium");
countries.forEach(country -> {
final String message = "'%s' has first province: '%s'";
System.out.println(String.format(message, country, walker.findProvinceForCountry(country).orElse("'not found'")));
});
}
}
class GeoObjectWalker {
private final JsonNode root;
public GeoObjectWalker(JsonNode root) {
this.root = root;
}
public Optional<String> findProvinceForCountry(String country) {
// find featureMember array
JsonNode featureMembers = root.at("/response/GeoObjectCollection/featureMember");
if (featureMembers.isMissingNode()) {
return Optional.empty();
}
for (int i = 0; i < featureMembers.size(); i++) {
JsonNode featureMember = featureMembers.get(i);
// find Components array
JsonNode components = featureMember.at("/GeoObject/metaDataProperty/GeocoderMetaData/Address/Components");
if (components.isMissingNode()) {
continue;
}
if (componentsArrayContains(components, "country", country)) {
Optional<String> province = findNameForKind(components, "province");
if (province.isPresent()) {
return province;
}
}
}
return Optional.empty();
}
private boolean componentsArrayContains(JsonNode array, String kind, String name) {
for (int i = 0; i < array.size(); i++) {
JsonNode node = array.get(i);
if (node.get("kind").asText().equals(kind) && node.get("name").asText().equals(name)) {
return true;
}
}
return false;
}
private Optional<String> findNameForKind(JsonNode array, String kind) {
for (int i = 0; i < array.size(); i++) {
JsonNode node = array.get(i);
if (node.get("kind").asText().equals(kind)) {
return Optional.of(node.get("name").asText());
}
}
return Optional.empty();
}
}
Над отпечатками кодов:
'Germany' has first province: 'Bayern'
'United States of America' has first province: 'South Carolina'
'Austria' has first province: 'Oberösterreich'
'Belgium' has first province: 'Vlaams Brabant'