2016-03-08 99 views
1

我嘗試了很多方法,但他們都一直說文件不存在,但它確實存在。它位於java文件夾中,但當它嘗試讀取它時失敗。我已取出JSON代碼,並將其存儲到Cloudboost工程中,但是我無法爲其提供超過1000個問題和答案...Android:閱讀JSON文件失敗

這是更新後的代碼:

public String loadJSON() { 
    String json = null; 
    try { 
     InputStream is = this.getAssets().open("QA.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; 
} 

public void addToTable() throws CloudException, FileNotFoundException, IOException, ParseException { 
    CloudObject table = new CloudObject("QuestionsAndAnswers"); 

    ArrayList<String> question = new ArrayList<String>(); 
    ArrayList<String> answer = new ArrayList<String>(); 
    ArrayList<Double> earnings = new ArrayList<Double>(); 

    JSONParser jsonParser = new JSONParser(); 
    Object obj = jsonParser.parse(new FileReader(loadJSON())); 
    JSONArray jsonArray = (JSONArray) obj; 

    for (int i = 0 ; i < jsonArray.size() ; i++) { 
     JSONObject jsonObject = (JSONObject) jsonArray.get(i); 
     question.add((String) jsonObject.get("Question")); 
     answer.add((String) jsonObject.get("Answer")); 
     if (jsonObject.get("Earnings") != null) { 
      earnings.add((Double) jsonObject.get("Earnings")); 
     } 
    } 

    question.add("Hello" + "?"); 
    answer.add("Hi"); 
    earnings.add(100.00); 

    question.add("What's up" + "?"); 
    answer.add("Nothing."); 
    earnings.add(50.00); 

    for (int i = 0 ; i < question.size() ; i++) { 
     table.set("question", question.get(i)); 
     table.set("answer", answer.get(i)); 
     table.set("earnings", earnings.get(i)); 

     table.save(new CloudObjectCallback() { 
      @Override 
      public void done(CloudObject x, CloudException e) { 
       if (e != null) { 
        // Error 
        Log.i("TABLE ERROR:", e.getMessage()); 
       } 
       if (x != null) { 
        // CloudObject 
       } 
      } 
     }); 
    } 
} 

這是我用得到的錯誤:

03-08 15:38:31.422 7817-7843/? W/System.err: java.io.FileNotFoundException: QA.json: open failed: ENOENT (No such file or directory) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:456) 
03-08 15:38:31.423 3182-5526/? W/ActivityManager: getRunningAppProcesses: caller 10136 does not hold REAL_GET_TASKS; limiting output 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:76) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:103) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.io.FileReader.<init>(FileReader.java:66) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at com.ehlien.clevercash.WelcomeActivity.addToTable(WelcomeActivity.java:75) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at com.ehlien.clevercash.WelcomeActivity$AddToTable.doInBackground(WelcomeActivity.java:119) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at com.ehlien.clevercash.WelcomeActivity$AddToTable.doInBackground(WelcomeActivity.java:115) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
03-08 15:38:31.423 3182-5826/? W/ActivityManager: getRunningAppProcesses: caller 10136 does not hold REAL_GET_TASKS; limiting output 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
03-08 15:38:31.423 7817-7843/? W/System.err:  at java.lang.Thread.run(Thread.java:818) 
03-08 15:38:31.423 7817-7843/? W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory) 
03-08 15:38:31.428 458-1078/? E/NetlinkEvent: NetlinkEvent::FindParam(): Parameter 'ALERT_NAME' not found 
03-08 15:38:31.428 7817-7843/? W/System.err:  at libcore.io.Posix.open(Native Method) 
03-08 15:38:31.429 7817-7843/? W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
03-08 15:38:31.429 7817-7843/? W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:442) 
03-08 15:38:31.429 7817-7843/? W/System.err: ... 12 more 

這是錯誤我現在得到:

03-08 16:01:58.947 6762-18889/? D/PackageBroadcastService: Received broadcast action=android.intent.action.PACKAGE_REPLACED and uri=com.ehlien.clevercash 
03-08 16:01:58.957 18865-18890/com.ehlien.clevercash W/System.err: java.io.FileNotFoundException: [ 
03-08 16:01:58.957 18865-18890/com.ehlien.clevercash W/System.err:  { 
03-08 16:01:58.957 18865-18890/com.ehlien.clevercash W/System.err:   "Question":"Carl and the Passions changed band name to what", 
03-08 16:01:58.957 18865-18890/com.ehlien.clevercash W/System.err:   "Answer":"Beach Boys" 
03-08 16:01:58.957 18865-18890/com.ehlien.clevercash W/System.err:  }, 

(All the way to the end of the file)... 

03-08 16:01:58.979 18865-18890/com.ehlien.clevercash W/System.err: ]: open failed: ENAMETOOLONG (File name too long) 
03-08 16:01:58.979 18865-18865/com.ehlien.clevercash D/AppTracker: App Event: start 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:456) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:76) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.io.FileInputStream.<init>(FileInputStream.java:103) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.io.FileReader.<init>(FileReader.java:66) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at com.ehlien.clevercash.WelcomeActivity.addToTable(WelcomeActivity.java:75) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at com.ehlien.clevercash.WelcomeActivity$AddToTable.doInBackground(WelcomeActivity.java:119) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at com.ehlien.clevercash.WelcomeActivity$AddToTable.doInBackground(WelcomeActivity.java:115) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err:  at java.lang.Thread.run(Thread.java:818) 
03-08 16:01:58.980 18865-18890/com.ehlien.clevercash W/System.err: Caused by: android.system.ErrnoException: open failed: ENAMETOOLONG (File name too long) 
03-08 16:01:58.981 6762-18858/? D/k: Processing package: com.ehlien.clevercash 
+2

沒有文件位於您指定的位置:'new FileReader(「QA.json」)'。這是因爲無路徑文件在Android上沒有意義。 Android設備或模擬器上的此文件在哪裏? – CommonsWare

+0

它直接在app/java文件夾下。我右鍵單擊並複製了參考文獻,這就是它給我的。我在Android設備上運行它。 –

+0

將你的文件'QA.json'放到你的android應用程序項目結構的'asset'目錄下。並使用AssetManager讀取文件。 – user370305

回答

0

它直接在應用程序/ java文件夾下

這是在您的開發機器上。這不是在Android設備上。

如果您想將JSON與您的Android應用一起發貨,請將其放入assets/。然後,使用AssetManager將資產上的InputStream傳遞給您所需的JSON解析器。

+0

好吧,我得到它加載文件,但由於某種原因,它給出了這個: '03-08 16:01:58.957 18865-18890 /? W/System.err:java.io.FileNotFoundException:[ 03-08 16:01:58.957 18865-18890 /? W/System.err:{ 03-08 16:01:58.957 18865-18890 /? W/System.err:「問題」:「卡爾和激情改變了樂隊名稱」, 03-08 16:01:58.957 18865-18890 /? W/System.err:「答案」:「沙灘男孩」 03-08 16:01:58.957 18865-18890 /? W/System.err:},等等等等。然後它在文件行末尾說:'打開失敗:ENAMETOOLONG(文件名太長)' –

+0

@MohamedMohamed:它看起來像你正在使用JSON字符串作爲文件名。 – CommonsWare

+0

我更新了顯示錯誤的代碼。 –