Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android将json响应改装为谷歌地图错误_Android_Nullpointerexception_Retrofit - Fatal编程技术网

Android将json响应改装为谷歌地图错误

Android将json响应改装为谷歌地图错误,android,nullpointerexception,retrofit,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":"GO

我在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"
  }
 ]
}
我已经为对象“placemarks”和所有Other项编写了这个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) {

        }
    });



}
private void getPlacemark(){
改装改装=新改装.Builder()
.baseUrl(“https://www.car2go.com/api/v2.1/vehicles?loc=roma&oauth_consumer_key=roadzapp&format=json")
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService=reformation.create(APIService.class);
Call Call=service.getPlacemark();
call.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
Log.d(“response:”,String.valueOf(response.body());
试一试{
mMap.clear();
//该循环将遍历所有结果,并在每个位置添加标记。
对于(int i=0;i
但现在,当我运行应用程序时,json是note load,并且for循环的第一行出现错误:

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

嗨,我发现了错误。 在APIService上,我以这种方式设置@GET方法:@GET(“.”),因为我将URL用作BaseURL中的URL。因此,如果我将所有url设置为@GET,该方法就可以正常工作。
如何仅将url使用到BaseULRalso到@GET?

很可能您的POJO与JSON结构不匹配。
您可以发布您的POJO类以及如何反序列化JSON吗?

首先,您只能调用
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();
那么你应该可以有

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


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

你应该把这个贴在上面的评论里。@cricket_007你是警察吗?就我而言,我用最有可能的问题原因回答了这个问题。你为什么不使用这些评论呢?因为你回答的第二部分正是我所回答的(而且很可能是NPE的原因),考虑到你在回答中提出了一个问题,我认为这不是一个好的答案。。。另一方面,我的答案解决了OkHttp的另一个问题,即只允许调用一次
response.body()
。因此,如果我删除这个问题,它将是一个可接受的答案,对吗?我对这一点很陌生,所以我以后会记住:)我会说一个可以接受的将包括正确的Java对象,或者您可以在上面进行评论,等待问题更新
@GET("/vehicles?format=json")
public ResponsePlacemarks getVehicles(
    @Query("oauth_consumer_key") String key, 
    @Query("loc") String loc
);