简体   繁体   English

无法读取json文件

[英]Can't read json file

Here's my method where im reading json file. 这是我读取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;
    }
}

And Exeption 和Exeption

Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.util.List.iterator()' on a null object reference at com.hookah.roma.hookahmix.TabakLab.LoadTabaksFromJson(TabakLab.java:61) at com.hookah.roma.hookahmix.TabakLab.(TabakLab.java:32) at com.hookah.roma.hookahmix.TabakLab.get(TabakLab.java:37) at com.hookah.roma.hookahmix.TabakListFragment.updateUI(TabakListFragment.java:38) at com.hookah.roma.hookahmix.TabakListFragment.onCreateView(TabakListFragment.java:32) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2184) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298) at android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2136) 由以下原因引起的:java.lang.NullPointerException:尝试在com.hookah.roma.hookahmix.TabakLab.LoadTabaksFromJson(TabakLab.com上的空对象引用上调用接口方法'java.util.Iterator java.util.List.iterator()'。 com.hookah.roma.hookahmix.TabakLab。(TabakLab.java:32)的com.hookah.roma.hookahmix.TabakLab.get(TabakLab.java:37)的com.hookah.roma.hookahmix的java:61)。 android.support.v4.app.Fragment.performCreateView(Fragment.java:2184)上的com.hookah.roma.hookahoomix.TabakListFragment.onCreateView(TabakListFragment.java:32)上的TabakListFragment.updateUI(TabakListFragment.java:38) android.support.v4.app.FragmentManagerImpl.moveFragmentsToInvisible(FragmentManager.java:2323)位于android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager)上的.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1298)的.java:2136)

And json file : 和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"
    },

Please put your json file in assets folder 请把你的json文件放在资产文件夹中

use AsyncTask to protect from ANR like situtation 使用AsyncTask来防止遭受像情景一样的ANR

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

then parse in 然后解析

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

more details at ParseJsonFileAsync.java ParseJsonFileAsync.java中有更多详细信息

Looks like you are not initialising your ArrayList, try changing: 看起来您没有初始化ArrayList,请尝试更改:

protected ArrayList<Tabak> tabakArrayList;

for: 对于:

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

It looks like your json schema issue, i'm guessing listOfTodos return null. 看来您的JSON模式问题,我猜listOfTodos返回null。 You can refer to this to generate your schema. 您可以参考以生成您的架构。

But sometimes that tools can make us confuse so i tried to create your schema manually like this: 但是有时候,这些工具会使我们感到困惑,所以我尝试像这样手动创建您的架构:

TabakRoot.java TabakRoot.java

public class TabakRoot {

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

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

TabakItem.java TabakItem.java

public class TabakItem {

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

public String getTabakFamily() {
    return tabakFamily;
}}

finally 最后

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

You're not initialising tabakArrayList , add a constructor to your ListOfTabaks as following 您没有初始化tabakArrayListtabakArrayList将构造函数添加到ListOfTabaks中,如下所示

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

and you should be fine 你应该没事的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM