通过索引在Java中查询JSON对象

问题描述 投票:0回答:2

在Java中,有没有办法通过索引从JSON对象中检索一条信息?我正在访问quandl上的财务数据表,并希望返回表中发布的最新抵押贷款利率。关键是以字符串形式过帐费率的日期。最新数据的密钥每周都会更改,但我想要的数据将始终是表中的第一个键值对。

我能在大约5分钟内在JavaScript中完成此操作。但在Java中似乎更麻烦。下面是我的代码的迭代,似乎最接近我想去的地方。我能够将表中设置的第一个键值对作为Java中的对象返回,这是... [“2017-12-14”,3.93]。最后一步是逃避我。我如何抓住3.93并返回?或者有更好的方法来解决这个问题吗?

double baseRate = 0.0;

default double getBaseRate() throws MalformedURLException {

    try {
        // make a GET request
        URL url = new URL("https://www.quandl.com/api/v3/datasets/FMAC/30US.json?api_key=-c-s9zf8s1NdLbhVin1p");
        HttpURLConnection request = (HttpURLConnection) url.openConnection();
        request.connect();
        InputStreamReader is = new InputStreamReader((InputStream) request.getContent());

        // Convert response stream to a JSON object
        JsonReader reader = Json.createReader(is);
        JsonObject obj = reader.readObject();
        reader.close();
        request.disconnect();

        // Drill down to the desired piece of data    
        JsonObject dataset = obj.getJsonObject("dataset");
        JsonArray data = dataset.getJsonArray("data");
        Object currentData = data.get(0);

        System.out.println(currentData);

    }   catch (IOException e) {
            e.printStackTrace();
    } 

    return baseRate;            
}
java json
2个回答
0
投票

我认为你需要进入另一个级别的数组来访问你需要的值。

    JsonArray data = dataset.getJsonArray("data");
    JsonArray firstPieceOfData = data.get(0);
    Object firstRate = firstPieceOfData.get(1); 

0
投票

如果你使用Jackson来读取你的JSON,你可以使用.at()方法,它允许你通过JSON指针表达式访问节点的值,在你的情况下,它将是"/dataset/data/0/1"

为了这个演示,我已经截断了你的json:

String jsonString = "{\"dataset\":{\"id\":4644596,\"dataset_code\":\"30US\",\"database_code\":\"FMAC\",\"name\":\"30-Year Fixed Rate Mortgage Average in the United States\",\"description\":\"Units: Percent\\u003cbr\\u003e\\u003cbr\\u003eNot Seasonally Adjusted\",\"refreshed_at\":\"2017-12-18T04:09:32.892Z\",\"newest_available_date\":\"2017-12-14\",\"oldest_available_date\":\"1971-04-02\",\"column_names\":[\"Date\",\"Value\"],\"frequency\":\"weekly\",\"type\":\"Time Series\",\"premium\":false,\"limit\":null,\"transform\":null,\"column_index\":null,\"start_date\":\"1971-04-02\",\"end_date\":\"2017-12-14\",\"data\":[[\"2017-12-14\",3.93],[\"2017-12-07\",3.94],[\"2017-11-30\",3.9]],\"collapse\":null,\"order\":null,\"database_id\":582}}";
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNodes = mapper.createObjectNode();
try {
    jsonNodes = mapper.readTree(jsonString);
} catch (IOException e) {
    //e.printStackTrace();
}
System.out.println(jsonNodes.at("/dataset/data/0/1").asDouble());// 3.93
© www.soinside.com 2019 - 2024. All rights reserved.