2013-02-09 96 views
0

我使用JSON文件來保存有關與此代碼的用戶一些信息:JSONParser無法讀取JSON文件

Login login = new Login(email, token, jsessionId); 

      JSONObject jsonObj = new JSONObject(); 

      JSONObject userDetail = new JSONObject(); 

      JSONArray listFiles = new JSONArray(); 

      userDetail.put("email", email); 
      token = EncodeUtil.encode(token); 
      userDetail.put("token", token); 
      userDetail.put("files", listFiles); 

      try { 

       if (!(file.exists())) { 

        JSONArray userDetails = new JSONArray(); 
        userDetails.add(userDetail); 
        jsonObj.put("users", userDetails); 

        FileWriter fileWriter = new FileWriter(file); 
        fileWriter.write(jsonObj.toString()); 
        fileWriter.flush(); 
        fileWriter.close(); 

       } else { 

        boolean emailExists = true; 

        JSONParser parser = new JSONParser(); 
        Object obj = parser.parse(new FileReader(file)); 
        JSONObject jsonObjReader = (JSONObject) obj; 
        JSONArray jsonArrayWriter = (JSONArray) jsonObjReader.get("users"); 
        int length = jsonArrayWriter.size(); 
        for (int i = 0; i < length; i++) { 
         Object currentObj = jsonArrayWriter.get(i); 
         JSONObject currentJson = (JSONObject) currentObj; 
         String email2 = (String) currentJson.get("email"); 
         if (email2.equals(email)) { 
          emailExists = true; 
         } else { 
          emailExists = false; 
         } 
        } 

        if (!emailExists) { 
         jsonArrayWriter.add(userDetail); 
         jsonObj.put("users", jsonArrayWriter); 
         FileWriter fileWriter = new FileWriter(file); 
         fileWriter.write(jsonObj.toString()); 
         fileWriter.flush(); 
         fileWriter.close(); 
        } 
       } 

      } catch (Exception e) { 

       Logger.getLogger(LoginLocalServiceImpl.class.getName()).log(Level.SEVERE, e.getMessage()); 

       throw new PortalException("Erro ao ler Json File"); 
      } 

它工作正常,並返回我JSON這種結構:

{"users":[ 
     {"files":[], 
     "token":"XXXX", 
     "email":"XXXX"} 
    ] 
} 

然後我嘗試在文件[]數組中添加一些信息,上面這段代碼:

try { 

       JSONObject fileRef = new JSONObject(); 
       fileRef.put("date", date); 
       fileRef.put("type", type); 
       fileRef.put("name", name); 

       JSONParser parser = new JSONParser(); 
       Object obj = parser.parse(new FileReader(file)); 

       JSONObject jsonObjReader = (JSONObject) obj; 
       JSONArray jsonArrayUsers = (JSONArray) jsonObjReader.get("users"); 

       for (int i = 0; i < jsonArrayUsers.size(); i++) { 
        JSONObject jsonTest = (JSONObject) jsonArrayUsers.get(i); 
        String emailTest = (String) jsonTest.get("email"); 
        if (emailTest.equals(email)) { 
         JSONArray jsonArrayFiles = (JSONArray) jsonTest.get("files"); 
         jsonArrayFiles.add(fileRef); 
      //    jsonTest.put("files", jsonArrayFiles); 
      //    jsonArrayUsers.add(jsonTest); 
      //    jsonObjReader.put("users", jsonArrayUsers); 

         //   System.out.println(jsonArrayFiles.toString()); 

        } 
       } 
       FileWriter fileWriter = new FileWriter(file); 
       fileWriter.write(jsonObjReader.toString()); 
       fileWriter.flush(); 
       fileWriter.close(); 

      } catch (IOException ex) { 
       Logger.getLogger(MainViewController.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (ParseException ex) { 
       Logger.getLogger(MainViewController.class.getName()).log(Level.SEVERE, null, ex); 
      } 

我的JSON文件現在顯示了我想要:

{"users":[ 
     {"files":[ 
      {"name":"d9f6cd671a384fe59bae29e2718463b5", 
      "type":"Apresentação", 
      "date":Sat Feb 09 13:48:32 GMT-03:00 2013} 
      ], 
     "email":"XXXX", 
     "token":"XXXX" 
     } 
    ] 
} 

沒問題,直到這裏。但是當我嘗試使用JSONParser再次加載我的JSON時,它無法被讀取,爲什麼?一切都顯得沒事:(

+0

你能告訴我你的確切錯誤嗎? – kaysush 2013-02-09 17:10:53

回答

4

日期應該用引號引起來

{ 
    "users": [{ 
     "files":[{ 
      "name":"d9f6cd671a384fe59bae29e2718463b5", 
      "type":"Apresentação", 
      "date":"Sat Feb 09 13:48:32 GMT-03:00 2013" 
     }], 
     "email":"XXXX", 
     "token":"XXXX" 
    }] 
} 
0

我假設的格式不正確的日期字符串是該庫是不會產生輸出一個錯字。我記。你與超越U + 007F值編寫代碼點

FileWriter fileWriter = new FileWriter(file); 

上面一行是有缺陷的,不使用Unicode轉換格式(UTF)作爲其默認編碼的任何系統上The documentation狀態:

這個類的構造方法假定默認的字符編碼

同樣的問題也存在於FileReader。這兩種類型都應該避免。

JSON mandates的Unicode:

JSON內容應以Unicode編碼。默認編碼是UTF-8。

如果您需要直接向您使用的JSON API提供字符數據,那麼您必須指定編碼。

閱讀:

try (InputStream in = new FileInputStream(filename); 
    Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)) { 
    // read from stream 
} 

寫作:

try (OutputStream out = new FileOutputStream(filename); 
    Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)) { 
    // write to stream 
} 

這是Java 7的代碼,但同樣的原則在早期版本的應用。有關Java中字符編碼的粗略指導,請參閱here。讀取機制不完整,因爲它沒有檢測到正在使用哪個UTF - 請參閱the spec進行必要的字節模式檢測。

作爲評論者指出,它不足以說「它不工作!」 - 你必須詳細說明失敗的性質。 Java開發人員期望出現錯誤堆棧跟蹤。