2016-12-03 132 views
0

我試圖通過http使用Retrofit for Android獲取JSON數據。我收到以下錯誤:Android Retrofit錯誤 - 嘗試調用空對象引用的接口方法'int java.util.List.size()'

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)

這是我的課程。

客戶:

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; 
    } 
} 

接口:

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()); 
      } 
     }); 
    } 
} 
+0

'response.body()。getShops()''是null' – Emmanuel

+0

那是什麼我不理解,這就是爲什麼它是空。 – teej2542

回答

2

這是JSON你試圖解析。 (修整)

{ 
    "searchResult": { 
     "searchListings": { 
      "searchListing": [{ 
       "businessName": "Playaz Barbershop", 
       "city": "Lawrenceville" 
      }, { 
       "businessName": "Upscale Barbers", 
       "city": "Lawrenceville" 
      }, { 
       "businessName": "All About You Hair Salon", 
       "city": "Lawrenceville" 
      }] 
     } 
    } 
} 

看起來像你的POJO類是錯誤的。這就是你得到null的原因。見下面的課程。

SearchList.java

public class SearchList { 
    public SearchResult searchResult; 

    // getters and setters 
} 

SearchResult.java

public class SearchResult { 
    public SearchListings searchListings; 

    // getters and setters 
} 

SearchListings.java

public class SearchListings { 
    public List<SearchListing> searchListing = new ArrayList<SearchListing>(); 

    // getters and setters 
} 

SearchListing.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()); 
} 
+0

我添加了POJO類,但是當我調用「response.body()。getSearchListing()。size())」時,它返回0.我期待結果爲20. – teej2542

+0

檢查編輯。 –

+0

工作。謝謝。 – teej2542

相關問題