2016-06-27 2 views
1

Я пытаюсь разобрать файл JSON, расположенный в папке «assets» для школьного проекта. Я выполнил аналогичный проект, который работал, и я понятия не имею, почему он возвращает исключение nullpointer. Я понимаю, что ошибка указывает, что я пытаюсь получить размер из списка, который является нулевым, но я не вижу, где я терпит неудачу. Я ценю любую помощь в этом вопросе, это сводит меня с ума.NullPointerException при анализе Json-файла из папки с активами

У меня есть MainActivity:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     NewsController newsController = new NewsController(); 
     List<RSSFeedCategory> rssFeedCategories = newsController.getRSSFeedCategoryList(this); 
     Integer rssFeedCategoryAmount = rssFeedCategories.size(); 
    } 
} 

У меня есть RSSFeedCategory Объект:

public class RSSFeedCategory { 
    private String categoryName; 
    private String objectId; 

    public RSSFeedCategory(String categoryName) { 
     this.categoryName = categoryName; 
    } 

    public String getCategoryName() { 
     return categoryName; 
    } 

    public String getObjectId() { 
     return objectId; 
    } 

    public void setCategoryName(String categoryName) { 
     this.categoryName = categoryName; 
    } 

    public void setObjectId(String objectId) { 
     this.objectId = objectId; 
    } 
} 

У меня есть контейнер объекта RSSFeedCategoryContainer:

public class RSSFeedCategoryContainer { 

    private List<RSSFeedCategory> rssFeedCategoryList; 

    public void setRssFeedCategoryList(List<RSSFeedCategory> rssFeedCategoryList) { 
     this.rssFeedCategoryList = rssFeedCategoryList; 
    } 

    public List<RSSFeedCategory> getRssFeedCategoryList() { 

     return this.rssFeedCategoryList; 
    } 
} 

У меня есть NewsController:

public class NewsController { 
    public List<RSSFeedCategory> getRSSFeedCategoryList(Context context){ 
     NewsDAO newsDAO = new NewsDAO(); 
     return newsDAO.getRSSFeedCategoryList(context); 
    } 
} 

У меня есть GenericDAO:

public class GenericDAO { 
    public Object getObjectJSON(Context context, Class aClass, String fileName){ 

     Object object = null; 
     try{ 

      AssetManager manager = context.getAssets(); 
      InputStream inputStream = manager.open(fileName); 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
      Gson gson = new Gson(); 
      object = gson.fromJson(bufferedReader, aClass); 
     } 
     catch (Exception e){ 
      e.printStackTrace(); 
     } 

     return object; 
    } 
} 

И у меня есть NewsDAO, расширяющий GenericDAO:

public class NewsDAO extends GenericDAO { 
    public List<RSSFeedCategory> getRSSFeedCategoryList(Context context){ 
     RSSFeedCategoryContainer rssFeedCategoryContainer = (RSSFeedCategoryContainer) getObjectJSON(context,RSSFeedCategoryContainer.class,"RSSFeedCategory.json"); 

     return rssFeedCategoryContainer.getRssFeedCategoryList(); 
    } 
} 

Вот RSSFeedCategory.json, который находится на папке "активов:

{ "results": [ 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Design", 
     "createdAt": "2015-02-03T08:55:30.775Z", 
     "objectId": "1ezmQEpd1i", 
     "updatedAt": "2015-02-03T08:55:30.775Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Technology", 
     "createdAt": "2015-02-03T08:55:29.894Z", 
     "objectId": "5dBaQy4wpf", 
     "updatedAt": "2015-02-03T08:55:29.894Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Music", 
     "createdAt": "2015-02-03T08:55:31.560Z", 
     "objectId": "73nctHMpkY", 
     "updatedAt": "2015-02-03T08:55:31.560Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Business", 
     "createdAt": "2015-02-03T08:55:30.465Z", 
     "objectId": "C4iDiuriB8", 
     "updatedAt": "2015-02-03T08:55:30.465Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Gadgets", 
     "createdAt": "2015-02-03T08:55:30.057Z", 
     "objectId": "FGTeskscsC", 
     "updatedAt": "2015-02-03T08:55:30.057Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Auto", 
     "createdAt": "2015-02-03T08:55:32.000Z", 
     "objectId": "J2YJqOxGIK", 
     "updatedAt": "2015-02-03T08:55:32.000Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Gaming", 
     "createdAt": "2015-02-03T08:55:31.405Z", 
     "objectId": "J4Oq3C7nxg", 
     "updatedAt": "2015-02-03T08:55:31.405Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Social", 
     "createdAt": "2015-02-03T08:55:32.170Z", 
     "objectId": "N6H0v01tCl", 
     "updatedAt": "2015-02-03T08:55:32.170Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Cooking", 
     "createdAt": "2015-02-03T08:55:31.849Z", 
     "objectId": "XzGdFekl2A", 
     "updatedAt": "2015-02-03T08:55:31.849Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Entertainment", 
     "createdAt": "2015-02-03T08:55:31.247Z", 
     "objectId": "Zk3DzKrF8k", 
     "updatedAt": "2015-02-03T08:55:31.247Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Fashion", 
     "createdAt": "2015-02-03T08:55:30.934Z", 
     "objectId": "ghJX0ATWfq", 
     "updatedAt": "2015-02-03T08:55:30.934Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Travel", 
     "createdAt": "2015-02-03T08:55:32.487Z", 
     "objectId": "hpPkcHkTTV", 
     "updatedAt": "2015-02-03T08:55:32.487Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Finance", 
     "createdAt": "2015-02-03T08:55:30.621Z", 
     "objectId": "nA3FO06l9z", 
     "updatedAt": "2015-02-03T08:55:30.621Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Photography", 
     "createdAt": "2015-02-03T08:55:31.087Z", 
     "objectId": "qC1VFzLgbF", 
     "updatedAt": "2015-02-03T08:55:31.087Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "News", 
     "createdAt": "2015-02-03T08:55:29.727Z", 
     "objectId": "uXFSxpJeDO", 
     "updatedAt": "2015-02-03T08:55:29.727Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Sports", 
     "createdAt": "2015-02-03T08:55:30.263Z", 
     "objectId": "yjHwfD1z3Y", 
     "updatedAt": "2015-02-03T08:55:30.263Z" 
    }, 
    { 
     "ACL": { 
      "*": { 
       "read": true 
      } 
     }, 
     "categoryName": "Humor", 
     "createdAt": "2015-02-03T08:55:32.320Z", 
     "objectId": "z8zyfeKhk7", 
     "updatedAt": "2015-02-03T08:55:32.320Z" 
    } 
] } 

Ошибка logcat:

06-26 20:46:35.161 5957-5957/ar.com.thomas.parsetest E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: ar.com.thomas.parsetest, PID: 5957 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{ar.com.thomas.parsetest/ar.com.thomas.parsetest.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
     at ar.com.thomas.parsetest.MainActivity.onCreate(MainActivity.java:17) 
     at android.app.Activity.performCreate(Activity.java:6237) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
     at android.app.ActivityThread.-wrap11(ActivityThread.java)  
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
     at android.os.Handler.dispatchMessage(Handler.java:102)  
     at android.os.Looper.loop(Looper.java:148)  
     at android.app.ActivityThread.main(ActivityThread.java:5417)  
     at java.lang.reflect.Method.invoke(Native Method)  
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  

ответ

1

Все, что вам нужно сделать, это добавить аннотацию:

@SerializedName("results") 
private List<RSSFeedCategory> rssFeedCategoryList; 

к вашему RSSFeedCategoryContainer. Без этого Gson не может правильно отобразить массив из json в поле rssFeedCategoryList

+0

это правильный ответ. Я люблю тебя. Полностью упущенный, что я изменил «результаты». Я поддержал это, но у меня пока нет достаточной репутации. Я новичок в программировании и весь день сжигаю голову, делаю и переделываю вещи. Большое спасибо!!! – Joey

+0

приветствуются – x0r

Смежные вопросы