1
resposta

Navegar pelo JSON

Boa tarde a todos.

Estou consumindo uma API que me entrega um JSON no formato exatamente como esse

{
    "Meta Data": {
        "1. Information": "Intraday (1min) open, high, low, close prices and volume",
        "2. Symbol": "MGLU3.SA",
        "3. Last Refreshed": "2020-04-14 15:54:00",
        "4. Interval": "1min",
        "5. Output Size": "Compact",
        "6. Time Zone": "US/Eastern"
    },
    "Time Series (1min)": {
        "2020-04-14 15:54:00": {
            "1. open": "42.7100",
            "2. high": "42.9500",
            "3. low": "42.7000",
            "4. close": "42.9200",
            "5. volume": "44710"
        },
        "2020-04-14 15:53:00": {
            "1. open": "42.7000",
            "2. high": "42.7200",
            "3. low": "42.7000",
            "4. close": "42.7000",
            "5. volume": "16660"
        }
    }
}

Acontece que a unica informação que me interessa é a primeira incidência do 'close' ou seja, preciso do valor 42.9200.

Ja tentei com JSONObject, e tambem ja tentei com Gson, porém trata-se de um JSON dinâmico, como podem ver, as datas sempre mudarão sempre que eu fizer a consulta.

Alguém pode me ajudar? Nao estou conseguindo de jeito nenhum.

1 resposta

Com o gson você pode fazer de duas maneiras:

Por JsonObject

    Gson gson = new Gson();

    JsonObject series = gson.fromJson(textJson, JsonObject.class)
                                .get("Time Series (1min)")
                                .getAsJsonObject();

    series.keySet().forEach(k -> System.out.println(series.getAsJsonObject(k).get("4. close")));

Ou criando um Java Object:

public class Serie {

    @SerializedName("Time Series (1min)")
    private Map<String, TimeSerie> timeserie;
    // getters e setters
}
public class TimeSerie {

    @SerializedName("4. close")
    private BigDecimal close;
    // getters e setters
}
    Serie serie = gson.fromJson(textJson, Serie.class);
    serie.getTimeserie().forEach((k,v) -> System.out.println(v.getClose()));