Android Raterofit JSON响应响应Google地图错误



我正在使用Android应用程序进行FIRTS时间改造。这是我必须检测的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"
  }
 ]
}

我已经为对象" placemarks"和所有otehr项目编写了此POJO模型。我已经编写了此代码以检验JSON数据并将其放入地图中:

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是注意负载,我在循环的第一行中有错误:

java.lang.nullpointerexception:尝试调用虚拟方法'java.util.list android.mobility.com.mobiity.model.model.responseplacemarks.getplacemarks.getplacemarksss.getplacemarkss'null对象参考

嗨找到了错误。在apiservice上,我以这种方式设置了@get方法:@get("。"),因为我将URL用作url to baseurl。因此,如果我将所有URL设置在@get中,则该方法可以正常工作。我如何将URL仅将URL用于@get?

首先,您只能精确调用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

我如何仅将URL用于@get?

您的基本URL应该看起来像

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
);

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

您的POJO很可能与JSON结构不符。您可以发布您的Pojo课程吗?您如何应对JSON?