2013-02-09 5 views
0

J'utilise un fichier JSON pour enregistrer quelques informations sur les utilisateurs avec ce code:JSONParser ne peut pas lire un fichier 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"); 
      } 

Il fonctionne très bien et me retourner un JSON avec cette structure:

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

J'essaie d'ajouter des informations dans des fichiers [] tableau avec ce code ci-dessus:

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); 
      } 

Mon fichier JSON montre maintenant ce que je voulez:

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

Aucun problème jusqu'à ici. Mais quand j'essaye de charger à nouveau mon json avec le premier code using JSONParser il ne peut pas être lu, pourquoi ?? Tout semble être bien :(

+0

Pouvez-vous dire quelle erreur exacte obtenez-vous? – kaysush

Répondre

4

La date devrait être entouré par des guillemets

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

Je suppose que la chaîne de date malformé est une faute de frappe que la bibliothèque ne va pas produire cette sortie. Je note . que vous écrivez points de code avec des valeurs au-delà de U + 007F

FileWriter fileWriter = new FileWriter(file); 

La ligne ci-dessus est défectueux sur tout système qui n'utilise pas un format de transformation Unicode (UTF) comme encodage par défaut The documentation états:.

Les constructeurs de cette classe suppose que le caractère par défaut le codage

Le même problème est présent dans FileReader. Les deux types doivent être évités.

JSON mandates Unicode:

texte JSON DOIT être codé en Unicode. L'encodage par défaut est UTF-8.

Si vous devez fournir des données de caractères directement à l'API JSON que vous utilisez, vous devez spécifier le codage.

Lecture:

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

Rédaction:

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

Ce code Java est 7, mais les mêmes principes dans les versions antérieures. Voir here pour un guide approximatif de l'encodage de caractères en Java. Le mécanisme de lecture est incomplet car il ne détecte pas quel UTF est utilisé - référez-vous à the spec pour la détection de modèle d'octet nécessaire.

En tant que commentateur noté, il est insuffisant de dire "ça ne marche pas!" - Vous devez détailler la nature de l'échec. Les développeurs Java attendent une trace de pile d'erreurs.