Android Retrofit json响应进入谷歌地图错误

时间:2017-03-04 18:24:43

标签: android nullpointerexception retrofit

我正在使用我的Android应用上的第一次改造。 这是我必须重审的json对象的结构:

{
"placemarks":[
  {
     "address":"Via di Santa Maria a Marignolle, 15, 50124 Firenze",
     "coordinates":[
        11.23348,
        43.75855,
        0
     ],
     "engineType":"CE",
     "exterior":"GOOD",
     "fuel":100,
     "interior":"GOOD",
     "name":"049/EV284TP",
     "smartPhoneRequired":false,
     "vin":"WME4513341K774636"
  }
 ]
}

我已经为对象"地标"写了这个Pojo模型。和所有otehr项目。 我已经编写了这段代码来检索json数据并将其放入map:

private void getPlacemark(){
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://www.car2go.com/api/v2.1/vehicles?loc=roma&oauth_consumer_key=roadzapp&format=json")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    APIService service = retrofit.create(APIService.class);
    Call<ResponsePlacemarks> call = service.getPlacemark();

    call.enqueue(new Callback<ResponsePlacemarks>() {
        @Override
        public void onResponse(Response<ResponsePlacemarks> response, Retrofit retrofit) {
            Log.d("response: ", String.valueOf(response.body()));
            try {
                mMap.clear();
                // This loop will go through all the results and add marker on each location.
                for (int i = 0; i < response.body().getPlacemarks().size(); i++) {
                    Double lat = response.body().getPlacemarks().get(i).getCoordinates().get(1);
                    Double lng = response.body().getPlacemarks().get(i).getCoordinates().get(0);
                    String placeName = response.body().getPlacemarks().get(i).getAddress();
                    MarkerOptions markerOptions = new MarkerOptions();
                    LatLng latLng = new LatLng(lat, lng);
                    // Position of Marker on Map
                    markerOptions.position(latLng);
                    // Adding Title to the Marker
                    markerOptions.title(placeName);
                    // Adding Marker to the Camera.
                    Marker m = mMap.addMarker(markerOptions);
                    // Adding colour to the marker
                    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
                    // move map camera
                    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
                    mMap.animateCamera(CameraUpdateFactory.zoomTo(11));
                }
            } catch (Exception e) {
                Log.d("onResponse", "There is an error");
                e.printStackTrace();
            }
        }

        @Override
        public void onFailure(Throwable t) {

        }
    });



}

但是现在当我运行应用程序时,json是note加载,我在for循环的第一行有错误:

  

java.lang.NullPointerException:尝试调用虚方法&#39; java.util.List android.mobility.com.mobiity.model.ResponsePlacemarks.getPlacemarks()&#39;在空对象引用上

您好找到了错误。 在APIService上,我以这种方式设置了@GET方法:@GET(&#34;。&#34;)因为我将URL用作URL到BaseURL。因此,如果我将所有网址设置为@GET,则该方法可以正常工作。 我如何只使用BaselRalso中的url进入@GET?

2 个答案:

答案 0 :(得分:1)

首先,您只能拨打response.body()一次。

所以,评论一下。

// Log.d("response: ", String.valueOf(response.body()));

并提取该列表变量

final ResponsePlacemarks _response = response.body();
final List<Placemark> placemarks = _response.getPlacemarks();

for (int i = 0; i < placemarks.size(); i++) {
    final Placemark p = placemarks.get(i);
    Coordinates c = p.getCoordinates();

    Double lat = c.get(1);
    Double lng = c.get(0);

    String placeName = p.getAddress();

如果这不起作用,那么您需要Java对象与JSON响应完全匹配,否则它为null

  

我如何只使用BaseULRalso中的url进入@GET?

您的基本网址应该是这样的

https://www.car2go.com/api/v2.1

然后你应该能够拥有像

这样的东西
@GET("/vehicles")
public ResponsePlacemarks getVehicles(
    @Query("oauth_consumer_key") String key, 
    @Query("format") String format
    @Query("loc") String loc
);

public ResponsePlacemarks getVehicles(String loc) {
    return getVehicles("roadzapp", "json", loc);
}

或者只是

@GET("/vehicles?format=json")
public ResponsePlacemarks getVehicles(
    @Query("oauth_consumer_key") String key, 
    @Query("loc") String loc
);

将密钥放入方法调用的原因是出于安全原因,您不应将密钥作为字符串存储在设备上。

答案 1 :(得分:-1)

您的POJO很可能与JSON结构不匹配。 你可以发布你的POJO课程,你如何反序列化JSON?