2017-02-25 183 views
0

这里是我读取json文件的方法。无法读取json文件

private void LoadTabaksFromJson() { 

    InputStream raw = mContext.getResources().openRawResource(R.raw.tabaks); 
    Reader reader = new BufferedReader(new InputStreamReader(raw)); 


    ListOfTabaks listOfTodos = new Gson().fromJson(reader, ListOfTabaks.class); 
    List<Tabak> todoList = listOfTodos.getTodoArrayList(); 

    for (Tabak item: todoList){ 
     mDataBase.insert(TabakTable.NAME,null,getContentValues(item)); 
    } 
} 


public class ListOfTabaks { 

    protected ArrayList<Tabak> tabakArrayList; 

    public ArrayList<Tabak> getTodoArrayList(){ 
     return tabakArrayList; 
    } 
} 

而且Exeption

所致:显示java.lang.NullPointerException:尝试一个空对象上调用接口 方法 'java.util.Iterator的java.util.List.iterator()' 参考 在 com.hookah.roma.hookahmix.TabakLab.LoadTabaksFromJson(TabakLab.java:61) 在com.hookah.roma.hookahmix.TabakLab。(TabakLab.java:32) 在com.hookah.roma。 hookahmix.TabakLab.get(TabakLab.java:37) 在 com.hookah.roma.hookahmix.TabakListFragment.updateUI(TabakListFragment.java:38) 在 com.hookah.roma.hookahmix.TabakListFragment.onCreateView(TabakListFragment.java:32) 在 android.support.v4 .app.Fragment.performCreateView(Fragment.java:2184) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) 在 android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager .java:2323) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(Fragment Manager.java:2136)

和JSON文件:

{ 
    "tabaksArrayList":[ 
    { 
     "name":"Абрикос", 
     "description":"Со вкусом Абрикоса", 
     "rating":"4.1", 
     "favourite":"1", 
     "family":"Al fakher" 
    }, 
    { 
     "name":"Ананас", 
     "description":"Со вкусом Ананаса", 
     "rating":"4.1", 
     "favourite":"1", 
     "family":"Al fakher" 
    }, 
    { 
     "name":"Апельсин", 
     "description":"Со вкусом Апельсина", 
     "rating":"4.1", 
     "favourite":"1", 
     "family":"Al fakher" 
    }, 
    { 
     "name":"Апельсин с мятой", 
     "description":"Со вкусом Апельсина с мятой", 
     "rating":"4.1", 
     "favourite":"1", 
     "family":"Al fakher" 
    }, 
+0

,哪一个是第61行? – Prashant

+0

@Prashant可能与增强for循环的行 – Androbin

+0

61:for(Tabak item:todoList){ 我明白由于列表的异常是空的,但为什么? –

回答

0

它看起来像你的JSON模式的问题,我是猜测listOfTodos返回null。你可以参考this来生成你的模式。

但有时那工具可以使我们迷惑,所以我试图手动创建您的模式是这样的:

TabakRoot.java

public class TabakRoot { 

@SerializedName("tabaksArrayList") 
private List<TabakItem> tabakItem = null; 

public List<TabakItem> getTabakItem() { 
    return tabakItem; 
}} 

TabakItem。java的

public class TabakItem { 

@SerializedName("family") 
@Expose 
private String tabakFamily; 

public String getTabakFamily() { 
    return tabakFamily; 
}} 

终于

TabakRoot listOfTodos = new Gson().fromJson(reader, TabakRoot.class); 
List<TabakItem> todoList = listOfTodos.getTabakItem(); 
+0

非常感谢:3 –

+0

不客气:) – Amigoz

0

请把你的JSON文件的资产文件夹

使用的AsyncTask从ANR保护像situtation

onBackground(){ 
    String json = null; 
    try { 
     InputStream stream = activity.getAssets().open("ur_json_file_in_assets_folder.json"); 
     int size = stream.available(); 
     byte[] buffer = new byte[size]; 
     stream.read(buffer); 
     stream.close(); 
     json = new String(buffer, "UTF-8"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return json; 
} 

然后解析

onPostExecute(String str){ 
JsonObject object = new JsonObject(str); 
JsonArray arr = object.getJsonArray("tabaksArrayList"); 
...} 

ParseJsonFileAsync.java

0

更多的细节看起来你是不是你的初始化ArrayList中,尝试改变:

protected ArrayList<Tabak> tabakArrayList; 

为:

protected ArrayList<Tabak> tabakArrayList = new ArrayList<>(); 
0

你没有初始化tabakArrayList,一个构造函数添加到您的ListOfTabaks如下

public ListOfTabaks{ 
    tabakArrayList = new ArrayList<>(); 
} 

,你应该罚款