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