2013-02-09 65 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开发人员期望出现错误堆栈跟踪。