2013-02-09 6 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" 
     } 
    ] 
} 

Нет проблем до сих пор. Но когда я пытаюсь загрузить мой json с помощью первого кода с помощью JSONParser, его нельзя прочитать, почему? Все, кажется, все в порядке :(

+0

Можете ли вы рассказать, какую точную ошибку вы получаете? – kaysush

ответ

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.

Если вам необходимо предоставить персональные данные непосредственно в API JSON, который вы используете, вы должны указать кодировку.

Reading:

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 код, но те же принципы применимы и в более ранних версиях. См. here для приблизительного руководства по кодировке символов в Java. Механизм чтения является неполным, так как он не обнаруживает, какой UTF используется. Обратитесь к the spec для определения необходимого байтового шаблона.

Как отметил комментатор, недостаточно сказать, что «это не работает!» - вы должны подробно описать характер неудачи. Разработчики Java ожидают трассировку стека ошибок.

 Смежные вопросы

  • Нет связанных вопросов^_^