我正在尝试使用 Retrofit for Android 通过 http 获取 JSON
数据。我收到以下错误:
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
我正在尝试从 JSON
结果中检索 businessName 和城市。
(searchListings->searchListing->businessName & searchListings->searchListing->city)
这是我的类(class)。
客户:
public class RestClient {
public static final String BASE_URL2 = "http://pubapi.yp.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL2)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
接口(interface):
public interface SearchAPIService {
@GET("/search-api/search/devapi/search?searchloc=30043&term=barbers&format=json&sort=distance&radius=1&listingcount=20&key=gmj3x7mhsh")
public
//End Url
Call<SearchList> fetchShopsList();
}
型号:
public class Search {
String businessName;
String city;
public String getName() {
return businessName;
}
public String getCity() {
return city;
}
}
持有列表的模型:
public class SearchList {
List<Search> searchListing;
public List<Search> getShops() {
return searchListing;
}
}
打印结果的MainActivity
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
SearchAPIService apiSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
apiSearch = RestClient.getClient().create(SearchAPIService.class);
fetchSearchList();
}
private void fetchSearchList() {
Call<SearchList> call = apiSearch.fetchShopsList();
call.enqueue(new Callback<SearchList>() {
@Override
public void onResponse(Call<SearchList> call, Response<SearchList> response) {
Log.d(TAG, "Total number fetched : " + response.body().getShops().size());
for(Search search : response.body().getShops()){
//Print out Business Name and City in log
Log.d(TAG, "Name: " + search.getName());
Log.d(TAG, "City: " + search.getCity());
}
}
@Override
public void onFailure(Call<SearchList> call, Throwable t) {
Log.e(TAG, "Got error : " + t.getLocalizedMessage());
}
});
}
}
最佳答案
这是您要解析的 JSON
。 (其余修剪)
{
"searchResult": {
"searchListings": {
"searchListing": [{
"businessName": "Playaz Barbershop",
"city": "Lawrenceville"
}, {
"businessName": "Upscale Barbers",
"city": "Lawrenceville"
}, {
"businessName": "All About You Hair Salon",
"city": "Lawrenceville"
}]
}
}
}
您的 POJO 类似乎有误。这就是您获得 null
的原因。请参阅下面的类(class)。
搜索列表.java
public class SearchList {
public SearchResult searchResult;
// getters and setters
}
搜索结果.java
public class SearchResult {
public SearchListings searchListings;
// getters and setters
}
搜索列表.java
public class SearchListings {
public List<SearchListing> searchListing = new ArrayList<SearchListing>();
// getters and setters
}
搜索列表.java
public class SearchListing {
public String businessName;
public String city;
// getters and setters
}
使用这些 POJO 类代替您的 POJO 类。
在onResponse
中,
@Override
public void onResponse(Call<SearchList> call, Response<SearchList> response) {
Log.e("ResponseSize", response.body().getSearchResult().getSearchListings().getSearchListing().size());
}
关于Android Retrofit 错误 - 尝试在空对象引用上调用接口(interface)方法 'int java.util.List.size()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949145/