我正在使用我的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?
答案 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?