2017-12-18 3 views
0

Javaでは、インデックスでJSONオブジェクトから情報を取得する方法はありますか?私はquandlの財務データテーブルにアクセスしており、テーブルに掲載されている最新の住宅ローン金利を返却したいと考えています。キーは、金利が文字列形式で転記された日付です。最新のデータのキーは毎週変更されますが、必要なデータは常にテーブルの最初のキーと値のペアになります。インデックスでJavaのJSONオブジェクトをクエリ

JavaScriptでこれを約5分で実行できました。しかし、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;    
} 

答えて

0

必要な値にアクセスするには、別のレベルの配列を下げる必要があると思います。

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

。ドキュメントを確認してください(ここにはJava EEのリンクがあります)。 https://docs.oracle.com/javaee/7/api/javax/json/JsonArray.html – PillHead

+0

ありがとう!これはgetJsonNumberを使って動作しました。 JsonArray data = dataset.getJsonArray( "data"); JsonArray currentData =(JsonArray)data.get(0); double currentRate = currentData.getJsonNumber(1).doubleValue(); –

+0

あなたは答えを受け入れることができますか? – PillHead

0

あなたはJSONを読み取るためのジャクソンを使用する場合は、あなたがあなたのケースで、私はあなたを切り捨ててきた"/dataset/data/0/1"

だろうJSONポインタ表現を介してノードの値にアクセスすることを可能にする.at()メソッドを使用することができますこのデモの目的のためにJSON:あなたは少しクリーナーになります文字列またはBigDecimalのよう値を取得することができるかもしれません使用しているJsonArrayの実装に依存

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 
関連する問題