从我的资产文件夹访问我的 json 文件时遇到问题

having trouble accessing my json file from my assets folder

在我的 android 应用程序中,我无法访问资产文件夹中的 json 文件。它一直给我一个 FileNotFoundException。

在不直接将其读入 InputStream 的情况下,我想获取 json 文件的位置。我尝试使用 /main/assets/data.json 或 ///android_assets/data.json 或 /assets/data.json。

这样做的主要目的是将保存 json 文件位置的字符串传递给另一个 class。

有没有办法将资产文件中 json 文件的位置返回给我?有什么地方可以检查以确保我的应用程序识别资产文件夹甚至是应用程序的一部分?

编辑:

在我的Activity

public void loadData(){
    String location = "file:///android_assets/data.json";
    JSONHandler json = new JSONHandler();
    List<ListItemObject> list = json.getJSONFile(location);
}

在我的 JSONHandler 中 Class

public ListItemObject getJSONFile(String Location){
File file = new File(address);
    InputStream in;
    InputStreamReader isr;
    JsonReader jr;
    List<SMRListItemObject> messages = null;
    try{
        in = new FileInputStream(file);
        isr = new InputStreamReader(in,"UTF-8");
        jr = new JsonReader(isr);
        messages = readMessagesArray(jr);
        jr.close();
        isr.close();
        in.close();
    } catch (FileNotFoundException e) {
        Log.d("Exception", "File Not Found");
    } catch (IOException e) {
        Log.d("Exception", "IO problem");
    }
    return messages;
}

我调用 getJSONFile 的那一行是我抛出 FileNotFoundException 的地方。

错误信息:

02-26 02:38:01.086  27165-27165/com.example.generalcounsel.sm       D/OpenGLRenderer﹕ Enabling debug mode 0
02-26 02:38:01.817  27165-27165/com.example.generalcounsel.sm D/Exception﹕ File Not Found
02-26 02:38:01.817  27165-27165/com.example.generalcounsel.sm D/AndroidRuntime﹕ Shutting down VM
02-26 02:13:59.690  25369-25369/com.example.generalcounsel.sm W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x418a5da0)
02-26 02:13:59.690  25369-25369/com.example.generalcounsel.sm E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.generalcounsel.sm, PID: 25369
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.generalcounsel.sm/com.example.generalcounsel.sm.ListActivity}: java.lang.NullPointerException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
        at android.app.ActivityThread.access0(ActivityThread.java:161)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at com.example.generalcounsel.sm.ListActivity.loadData(ListActivity.java:72)
        at com.example.generalcounsel.sm.ListActivity.onCreate(ListActivity.java:51)
        at android.app.Activity.performCreate(Activity.java:5426)
        at    android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)

尝试使用以下方式打开文件

AssetManager assetManager = getAssets();
InputStream ims = assetManager.open("data.json");

此外,getAssets() 仅适用于上下文,您可能需要上下文才能在 class 中调用它而不是 activity.

使用以下代码从资产中读取 json 文件

public String loadJSONFromAsset() {
    String json = null;
    try {

        InputStream is = getAssets().open("file_name.json");

        int size = is.available();

        byte[] buffer = new byte[size];

        is.read(buffer);

        is.close();

        json = new String(buffer, "UTF-8");


    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;

}

然后使用以下代码解析为 json 对象

JSONObject obj = new JSONObject(json_return_by_the_function);