2015-03-28 18 views
11

Nella mia applicazione Web riesco a visualizzare i dati nella tabella html utilizzando mybatis. Ora voglio salvare i record della tabella Mysql in un file JSON e creare un array di utenti, ho usato Gson, il problema è che solo un record salvato nel file. Grazie.
Qui il risultato in file.json:Come salvare i dati con GSON in un file JSON?

{"data": 
[ 
{"id":2,"Name":"Mike"} 
] 
} 

servlet.java

SqlSession session = MyBatisSqlSessionFactory.getSession(); 
List<User> users = session.selectList("dao.UserDao.findAll"); 
for (User u : users) { 
    Gson gson = new Gson(); 
    try { 
     JsonWriter writer = new JsonWriter(new FileWriter("C:\\file.json")); 
     writer.beginObject(); 
     writer.name("data"); 
     writer.beginArray(); 
     writer.beginObject(); 
     writer.name("id").value(t.getId()); 
     writer.name("name").value(t.getNom()); 
     writer.endObject(); 
     writer.endArray(); 
     writer.endObject(); 
     writer.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

session.close(); 
+0

perché si scrive sullo stesso file in ogni iterazione del ciclo. Devi scrivere _list_ nel file, non ogni elemento. –

+0

se ti capisco, sposto la riga "JsonWriter writer = new JsonWriter (new FileWriter (" C: \\ file.json "));" prima della riga di, ma lo stesso risultato –

+0

Quindi non capisci. Devi scrivere la 'lista'! Gson lo serializzerà su JSON bene da solo. –

risposta

23

Si scrive da tutti gli utenti nello stesso file di C:\\file.json così solo l'ultima iterazione del ciclo salvato.

È possibile convertire l'oggetto List<User> in JSON e scrivere una volta (senza anello necessario)

Esempio:

try (Writer writer = new FileWriter("Output.json")) { 
    Gson gson = new GsonBuilder().create(); 
    gson.toJson(users, writer); 
} 
+2

grazie per la risposta, ho avuto tutti gli utenti nel file JSON, ma perché il backslash con stringhe.Non ho bisogno di backslash."[ {\" id \ ": 1, \" nome \ ": \" Nancy \ "}, {\" id \ ": 2, \" detail \ ": \" Mike \ "} ]" –

+0

Se lo salvi come oggetto completo senza cambiare la stringa, puoi facilmente convertirlo nuovamente al tuo oggetto, ma dipende dalla tua missione –

+0

hai qualche soluzione sul mio primo suggerimento con il loop? –

1

ero in precedenza usando outputStream.writeObject e Serializable con lo scrittore default/lettore per il salvataggio dei dati dell'oggetto. A causa di problemi con la sostenibilità del codice, ho cercato qualcos'altro. Questo è il risultato. Quel BufferedWriter è obbligatorio, altrimenti la velocità di scrittura diminuisce di 8 volte. Si noti che la dichiarazione UTF-8 è default encoding of Json. Non sono sicuro se non dichiararlo è sicuro.

Esempio:

private void saveJson(Object object, Type type, String directory, String fileName) { 

    File file = new File(getApplicationContext().getDir(directory, Context.MODE_PRIVATE), 
      fileName); 
    OutputStream outputStream = null; 
    Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting() 
      .create(); 
    try { 
     outputStream = new FileOutputStream(file); 
     BufferedWriter bufferedWriter; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, 
        StandardCharsets.UTF_8)); 
     } else { 
      bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); 
     } 

     gson.toJson(object, type, bufferedWriter); 
     bufferedWriter.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(saveJson, "saveUserData, FileNotFoundException e: '" + e + "'"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(saveJson, "saveUserData, IOException e: '" + e + "'"); 
    } finally { 
     if (outputStream != null) { 
      try { 
       outputStream.flush(); 
       outputStream.close(); 
      } catch (IOException e) { 
       if (DEBUG) Log.e(saveJson, "saveUserData, finally, e: '" + e + "'"); 
      } 
     } 
    } 

} 


private Object loadJson(Type type, String directory, String fileName) { 
    Object jsonData = null; 

    File file = new File(getApplicationContext().getDir(directory, Context.MODE_PRIVATE), 
      fileName); 
    InputStream inputStream = null; 
    Gson gson = new GsonBuilder().enableComplexMapKeySerialization().setPrettyPrinting() 
      .create(); 
    try { 
     inputStream = new FileInputStream(file); 
     InputStreamReader streamReader; 
     if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      streamReader = new InputStreamReader(inputStream, 
        StandardCharsets.UTF_8); 
     } else { 
      streamReader = new InputStreamReader(inputStream, "UTF-8"); 
     } 

     jsonData = gson.fromJson(streamReader, type); 
     streamReader.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(TAG, "loadJson, FileNotFoundException e: '" + e + "'"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     if (DEBUG) Log.e(TAG, "loadJson, IOException e: '" + e + "'"); 
    } finally { 
     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (IOException e) { 
       if (DEBUG) Log.e(TAG, "loadJson, finally, e: '" + e + "'"); 
      } 
     } 
    } 
    return jsonData; 
} 

dove tipo ad esempio:

Type type = new TypeToken<Map<String, Object>>() { }.getType(); 
0

correzione rapida per il tuo codice:

SqlSession session = MyBatisSqlSessionFactory.getSession(); 
List<User> users = session.selectList("dao.UserDao.findAll"); 
try { 
    JsonWriter writer = new JsonWriter(new FileWriter("C:\\file.json")); 
    writer.beginObject(); 
    writer.name("data"); 
    writer.beginArray(); 
    for (User u : users) { 
     writer.beginObject(); 
     writer.name("id").value(t.getId()); 
     writer.name("name").value(t.getNom()); 
     writer.endObject(); 
    } 
    writer.endArray(); 
    writer.endObject(); 
    writer.close(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Tuttavia, nel caso in cui la classe utente si presenta così :

public class User { 
    String id; 
    String name; 
} 

Quindi non è necessario codificare l'adattatore poiché Gson è in grado di generare automaticamente il codice JSON per una classe che ha solo primitive (int, stringhe, ecc.). Quindi il tuo codice apparirebbe come @ roy-shmuli, ma solo se ometti i dati e mantieni solo la matrice poiché List può essere completamente generato senza un adattatore. Il codice JSON generato sarebbe il seguente:

[ 
    {"id":1, "name": "Mike"}, 
    {"id":2, "name": "Lucy"} 
] 

Spero che aiuti i principianti.