Mapa GeoJSON a Java con Jackson

Dominica:

Estoy tratando de convertir un archivo JSON en objetos Java usando la biblioteca de Jackson. Este archivo es un archivo JSON de varios niveles que se pueden encontrar aquí:

https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson

Es la lista de los terremotos que ocurrieron en los últimos 30 días en los EE.UU..

Esta es la estructura de este archivo hijo: https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php

Ahora, escribí un programa Java que está leyendo campos de este archivo, específicamente Estoy tratando de acceder al campo que se encuentra bajo características -> propiedades -> lugar (por ejemplo, desde el archivo original "lugar": "17 kilometros NW de pináculos, CA ")). Cuando llego al campo de propiedades puedo leerlo como un LinkedHashMap, pero el siguiente nivel, por lo que los valores y las claves de esta LinkedHashMap se leen como cadenas:

por ejemplo este es uno de los valores: {type = punto, coordenadas = [- 121.2743333, 36.6375, 8,61]}

Quiero leer estos valores como otro objeto (NO CADENA, MAP, tal vez?), Así que fue posible extraer otros datos de TI.

Aquí está mi clase:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.map.ObjectMapper;

@JsonIgnoreProperties(ignoreUnknown = true)
public class ReadJSONFile {

    private StringBuffer stringBuffer = new StringBuffer();

public void convert_json_to_java() throws Exception {

    String url = "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson";
    URL obj = new URL(url);
    HttpURLConnection con = (HttpURLConnection) obj.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String inputLine;

        while ((inputLine = in .readLine()) != null) {
                stringBuffer.append(inputLine);
                stringBuffer.append("\n");
        } in.close();
}

@SuppressWarnings("unchecked")
public void map_to_object() throws Exception {

    ObjectMapper om = new ObjectMapper();

    //ignore fields that are not formatted properly
    om.configure(org.codehaus.jackson.map.DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    Map<Object, Object> resultMap = om.readValue(stringBuffer.toString(), Map.class);
    ArrayList<Object> featuresArrayList = (ArrayList<Object>) resultMap.get("features");

    for(Object o : featuresArrayList) {
        LinkedHashMap<Object, Object> propertiesMap = (LinkedHashMap<Object, Object>) o;
        for(Map.Entry<Object, Object> entry : propertiesMap.entrySet()) {

            //HERE IS THE PROBLEM, THE VALUES OF THIS MAP (SECOND OBJECT) IS BEING READ AS A STRING
            //WHILE SOME VALUES ARE NOT A STRING:
            //e.g. {type=Point, coordinates=[-121.2743333, 36.6375, 8.61]}
            //AND I WANT TO READ IT AS A MAP OR ANY OTHER OBJECT THAT WOULD ALLOW ME TO ACCESS THE DATA
            String propertiesMapValues = entry.getValue().toString();
            }
        }
    }
}

Main.java

public class Main {
    public static void main(String[] args) throws Exception {       
        ReadJSONFile rjf = new ReadJSONFile();
        rjf.convert_json_to_java();
        rjf.map_to_object();
    }
}

Maven dependencia: https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl

Cuando intento lanzar este último objeto de otra cosa que de cuerdas, el programa me da una excepción (no puede lanzar cuerdas a otro objeto). ¿Hice algo mal? ¿Puede alguien decirme lo que puedo hacer para acceder a esos campos sin modificar Cuerdas (por ejemplo, dividir en partes matrices, etc.)?

MAFOR:

En realidad, el código funciona, pero podría ser un poco simplificada. El método convert_json_to_javano es necesario, se puede pasar la dirección URL directamente al ObjectMapper.

Los valores en el mapa no se leen como cadenas, pero ellos se están convirtiendo al Cuerdas llamando toString(), que se define para todos los objetos. Acctual tipos pueden ser Mapa, Lista, cadena, entero, etc., dependiendo del contenido de JSON. Trabajar con un mapa genérico es de hecho un poco molesto, así que yo sugeriría que la conversión de los valores a los objetos estructurados. GeoJSON es un estándar abierto, por lo que hay bibliotecas de código abierto que facilita su uso, por ejemplo GeoJSON-Jackson .

Usted tendría que agregar una dependencia maven:

<dependency>
    <groupId>de.grundid.opendatalab</groupId>
    <artifactId>geojson-jackson</artifactId>
    <version>1.8.1</version>
</dependency>

A continuación, el programa podría ser algo como:

import org.geojson.*

// ...

public class ReadJSONFile {

    ObjectMapper om = new ObjectMapper();

    public void mapToObject(String url) throws Exception {

        Map<String, Object> resultMap = om.readValue(new URL(url), new TypeReference<Map<String, Object>>() {});
        List<Feature> features = om.convertValue(resultMap.get("features"), new TypeReference<List<Feature>>() {});

        for(Feature f : features) {
            // Write the feature to the console to see how it looks like
            System.out.println(om.writeValueAsString(f));
            // Extract properties
            Map<String,Object> properties = f.getProperties();
            // ....
            // Extract geometry
            GeoJsonObject geometry = f.getGeometry();
            if(geometry instanceof Point) {
                Point p = (Point) geometry;
                // do something with the point
            }  else if(geometry instanceof LineString) {
                LineString mls = (LineString) geometry;
                // ...
            } else if(geometry instanceof MultiLineString) {
                MultiLineString mls = (MultiLineString) geometry;
                // ...
            } else if(geometry instanceof MultiPoint) {
                MultiPoint mp = (MultiPoint) geometry;
                // ...
            } else if(geometry instanceof Polygon) {
                Polygon pl = (Polygon) geometry;
                // ...
            } else if(geometry != null) {
                throw new RuntimeException("Unhandled geometry type: " + geometry.getClass().getName());
            }
        }
    }

    public static void main(String[] args) throws Exception {
        ReadJSONFile rjf = new ReadJSONFile();
        rjf.mapToObject("https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson");
    }
}        

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=362828&siteId=1
Recomendado
Clasificación