簡體   English   中英

無法讀取json文件

[英]Can't read 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;
    }
}

和Exeption

由以下原因引起的: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)

和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"
    },

請把你的json文件放在資產文件夾中

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

然后解析

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

ParseJsonFileAsync.java中有更多詳細信息

看起來您沒有初始化ArrayList,請嘗試更改:

protected ArrayList<Tabak> tabakArrayList;

對於:

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

看來您的JSON模式問題,我猜listOfTodos返回null。 您可以參考以生成您的架構。

但是有時候,這些工具會使我們感到困惑,所以我嘗試像這樣手動創建您的架構:

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();

您沒有初始化tabakArrayListtabakArrayList將構造函數添加到ListOfTabaks中,如下所示

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

你應該沒事的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM