[英]null pointer exception parsing json using GSON Android
我正在調用一個Web服務,該服務從數據庫獲取數據並輸出以下JSON:
{"eventId":"1","eventTitle":"opening ceremony","eventCategory":"store","eventSubCategory":"clothing","eventDescription":"This is an event description of some kid for the first event","eventDate":"13/05/2012","eventTime":"14:52","eventAddress":"49 somerset road","eventCity":"southsea","eventCountry":"UK","eventWebsite":"www.nxtldn.com","eventEmail":"lg@nxtldn.com","eventPhone":"07757491567","eventKeywords":"clothes, street, wear, heart, love"},{"eventId":"2","eventTitle":"cupcakes","eventCategory":"Store","eventSubCategory":"food","eventDescription":"This is an event description of some kid for the second event","eventDate":"17/05/2012","eventTime":"11:22","eventAddress":"12 cleveleys road","eventCity":"london","eventCountry":"UK","eventWebsite":"www.ashshort.com","eventEmail":"ashshort@short.com","eventPhone":"0778514562","eventKeywords":"cupcakes, store, london, hipster"}]
我將其附加(我已經使用http://jsonlint.com/測試了JSON是否有效):
{"Events":[{"eventId":"1","eventTitle":"opening ceremony","eventCategory":"store","eventSubCategory":"clothing","eventDescription":"This is an event description of some kid for the first event","eventDate":"13/05/2012","eventTime":"14:52","eventAddress":"49 somerset road","eventCity":"southsea","eventCountry":"UK","eventWebsite":"www.nxtldn.com","eventEmail":"lg@nxtldn.com","eventPhone":"07757491567","eventKeywords":"clothes, street, wear, heart, love"},{"eventId":"2","eventTitle":"cupcakes","eventCategory":"Store","eventSubCategory":"food","eventDescription":"This is an event description of some kid for the second event","eventDate":"17/05/2012","eventTime":"11:22","eventAddress":"12 cleveleys road","eventCity":"london","eventCountry":"UK","eventWebsite":"www.ashshort.com","eventEmail":"ashshort@short.com","eventPhone":"0778514562","eventKeywords":"cupcakes, store, london, hipster"}]}
我用AsyncTask稱呼它
public class EventSync extends AsyncTask<String, Integer, EventsList> {
EventsList elist1 = new EventsList();
@Override
protected EventsList doInBackground(String... urls) {
String tempurl = urls[0];
String output = "";
InputStream is = null;
StringBuilder sb = new StringBuilder();
EventsList list = new EventsList();
try
{
URL url = new URL(tempurl);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.connect();
is = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
try
{
is.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
output = sb.toString();
String json = "{\"Events\":" + output + "}";
System.out.println(json);
Gson gson = new Gson();
// When debugging this is the line I believe it fails on, It points to a bit of memory but the list is empty.
EventsList jsonlist = gson.fromJson(json, EventsList.class);
return jsonlist;
}
@Override
protected void onPostExecute(EventsList list)
{
System.out.println("in on post");
for (Event event : list.getEvents())
{
System.out.println(event.getEventId());
}
}}
public class EventsList {
public EventsList(){
}
private List<Event> events;
public List<Event> getEvents()
{
return events;
}
public void setEventsList(List<Event> events)
{
this.events = events;
}}
public class Event {
private String eventId;
private String eventTitle;
private String eventCategory;
private String eventSubCategory;
private String eventDescription;
private String eventDate;
private String eventTime;
private String eventAddress;
private String eventCity;
private String eventCountry;
private String eventWebsite;
private String eventEmail;
private String eventPhone;
private String eventKeywords;
public Event()
{
}
// ALL GETS AND SETS
目前,我只是在嘗試測試它,看它是否會返回,然后再使用自定義適配器填充列表視圖。 但不幸的是,我收到以下錯誤:
11-10 23:37:08.315: E/AndroidRuntime(5592): FATAL EXCEPTION: main
11-10 23:37:08.315: E/AndroidRuntime(5592): java.lang.NullPointerException
11-10 23:37:08.315: E/AndroidRuntime(5592): at com.nxtldn.trill.EventSync.onPostExecute(EventSync.java:71)
11-10 23:37:08.315: E/AndroidRuntime(5592): at com.nxtldn.trill.EventSync.onPostExecute(EventSync.java:1)
11-10 23:37:08.315: E/AndroidRuntime(5592): at android.os.AsyncTask.finish(AsyncTask.java:631)
11-10 23:37:08.315: E/AndroidRuntime(5592): at android.os.AsyncTask.access$600(AsyncTask.java:177)
11-10 23:37:08.315: E/AndroidRuntime(5592): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
11-10 23:37:08.315: E/AndroidRuntime(5592): at android.os.Handler.dispatchMessage(Handler.java:99)
11-10 23:37:08.315: E/AndroidRuntime(5592): at android.os.Looper.loop(Looper.java:137)
11-10 23:37:08.315: E/AndroidRuntime(5592): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-10 23:37:08.315: E/AndroidRuntime(5592): at java.lang.reflect.Method.invokeNative(Native Method)
11-10 23:37:08.315: E/AndroidRuntime(5592): at java.lang.reflect.Method.invoke(Method.java:511)
11-10 23:37:08.315: E/AndroidRuntime(5592): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-10 23:37:08.315: E/AndroidRuntime(5592): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-10 23:37:08.315: E/AndroidRuntime(5592): at dalvik.system.NativeStart.main(Native Method)
我是android的新手,所以不確定是否有更好的方法或正確的方法。
GSON為何不接受並返回空指針,這是我的JSON結構的原因嗎?
在此先感謝任何可以提供幫助的人:)
嘗試改變
EventsList jsonlist = gson.fromJson(json, EventsList.class);
至
Event[] jsonlist = gson.fromJson(json, Event[].class);
假設您在Web服務中使用了Event類型的數組(如上例所示)創建此json。 我認為當前的問題是您的json字符串與EventList類不匹配,因此返回null。 確保您的服務和android項目中的Event類匹配。
在EventsList中,您期望事件的List(Collection),但是您附加的JSON實際上是一個對象:“ {\\” Events \\“:” + output +“}”; 也許您希望它看起來像這樣:
"{\"Events\":[" + output + "]}";
這會將您的單個事件置於一系列潛在事件中。 您的用例令人困惑,我不確定為什么要將單個JSON對象放入數組,但是也許我缺少更多細節。
我發現這是由於我在字符串生成器中添加了“ / n”,創建了新行並截斷了json的最后一個}。 感謝大家
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.