Android Retrofit 错误 - 尝试在空对象引用上调用接口(interface)方法 'int java.util.List.size()'

标签 android json nullpointerexception retrofit

我正在尝试使用 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/

相关文章:

android - 手机关机后应用程序能否保留其root访问权限?

java - 在 Android 上使用 Jersey 客户端发布大型 JSON 字符串

php - 从 Javascript 获取 JSON 数据

java - 安卓java.lang.RuntimeException : Unable to resume activity

android - 以编程方式检测 Android 设备是否能够进行存储加密

安卓套接字代码

android - 如何在此 android 示例中添加 TitleBar?

c# - 使用 Json.NET 将嵌套 Firebase 数据库对象转换为 C# 对象

android - SwitchCompat 在 RecyclerView 中给出空指针异常

java - 在 onCreate() 中更改文本时出现空指针异常