2017-03-15 19 views
1

コールが特定のURLを消費するサービスがあります。私はアイテムのクラスと項目の特定のフィールドのための別のクラスを持っています。フィールドの1つが配列で、アクセスする必要があります。Spring Restテンプレートを使用した休憩サービスの呼び出し

"items"[{ 
    "success":true, 
    "publicKey":"dZ4EVmE8yGCRGx5XRX1W", 
    "stream":{ 
    "_doc":{ 
     "tags":[ 
     "battery", 
     "humidity", 
     "light", 
     "pressure", 
     "rain", 
     "temperature", 
     "weather", 
     "wind" 
     ] 
     "date":"2014-04-05T14:37:39.441Z", 
     "last_push":"2014-09-12T18:22:26.252Z", 
     "hidden":false, 
     "flagged":false, 
     "alias":"wimp_weather", 
     "location":{ 
     "long":"Boulder, CO, United States", 
     "city":"Boulder", 
     "state":"Colorado", 
     "country":"United States", 
     "lat":"40.0149856", 
     "lng":"-105.27054559999999" 
     }, 
     "title":"Wimp Weather Station", 
     "description":"Weather station on top my roof. Read the full tutorial here: https://learn.sparkfun.com/tutorials/weather-station-wirelessly-connected-to-wunderground", 
     "__v":0, 
     "_id":"534015331ebf49e11af8059d" 
    }, 
    } 
] 
} 

私は、publicKeyとlocationを取得しようとしています。しかし、結果は次のとおりです。

{"success":true,"publicKey":"dZ4EVmE8yGCRGx5XRX1W","location":null} 

私は結果に

@RequestMapping("/weather") 
public ResponseEntity result() { 

    WeatherPOJO result = weatherService.fetchWeather(); 
    return new ResponseEntity(result.getItems().get(0), HttpStatus.OK); 
} 

を取得するには、このメソッドを使用し、これはURL

public WeatherPOJO fetchWeather() { 
    WeatherPOJO rest = restTemplate.getForObject(
      "https://data.sparkfun.com/streams/dZ4EVmE8yGCRGx5XRX1W.json" 
      , WeatherPOJO.class); 
    return rest; 
} 

WeatherItemクラス

package com.example.services; 

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 

@JsonIgnoreProperties(ignoreUnknown=true) 
public class WeatherItem { 

    private boolean success; 
    private String publicKey; 
    private String location; 

    public boolean isSuccess() { 
     return success; 
    } 

    public void setSuccess(boolean success) { 
     this.success = success; 
    } 


    public String getPublicKey() { 
     return publicKey; 
    } 

    public void setPublicKey(String publicKey) { 
     this.publicKey = publicKey; 
    } 

    public String getLocation() { 
     return location; 
    } 

    public void setLocation(String location) { 
     this.location = location; 
    } 
} 
をフェッチするクラスです

WeatherPOJO

package com.example.services; 

import java.util.List; 

public class WeatherPOJO { 

    private List<WeatherItem> items; 

    public List<WeatherItem> getItems() { 
     return items; 
    } 

    public void setItems(List<WeatherItem> items) { 
     this.items = items; 
    } 
} 

なぜ私は場所の値に到達できませんか?

+0

JSONの 'location'フィールドに対応するJavaクラスを追加してください。 –

+0

また、あなたは興味があるかもしれません[次の回答](http://stackoverflow.com/a/30528321/3465375) –

+0

@SirCelsius私はすべてのクラスを追加しました。 – Saakina

答えて

1

ロケーションがさらにネストされているため。あなたのWeatherItemにこれを追加してみてください:

@JsonProperty("stream") 
public void setStream(Map<String, Object> nested) { 
    this.location = nested.get("_doc").get("location").get("long"); 
} 

はもちろん、これが唯一のあなたの位置変数の場所にあなたの場所の長い名前を取得します。あなたはすべてのフィールドをしたい場合は、もちろん

private Location location; 
... 

@JsonProperty("stream") 
public void setStream(Map<String, Object> nested) { 
    Map<String, Object> loc = nested.get("_doc").get("location"); 
    this.location = new Location(); 
    this.location.setCity(loc.get("city")); 
    .... 
} 

を彼らとBeanを作成し、全体の場所のオブジェクトをマッピングする最も簡単な方法は、構造体へのあなたのPOJOに一致するようになります(無関係なプロパティ/ゲッター/セッターはのために取り残さ簡潔性):

class WeatherItem { 
    Stream stream; 
} 
class Stream { 
    Doc _doc; 
} 
class Doc { 
    Location location; 
} 
class Location { 
    String city; 
    Double lat; 
    Double lon; 
    .... 
} 
+0

this.location = nested.get( "_ doc")。get( "location")。get( "long");これは動作しません。私は1つしか追加できません。 – Saakina

+0

何が返されますか? – DeezCashews

+0

私は最後の解決策を使用しました。そして、jsonファイルのさまざまなレベルの項目に対して異なるポーズを作成しました。ありがとう@DeezCashews。 – Saakina

関連する問題