Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save data with gson in a json file?

In my web application I succeed in displaying data in html table using mybatis. Now I want to save the records of the Mysql table in a json file and create an array of users, I used Gson, the problem is that just one record saved in the file. Thanks.
Here the result in 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(); 
like image 663
mak_doni Avatar asked Mar 28 '15 16:03

mak_doni


People also ask

How do I write to json file with Gson?

Saving Data to a JSON File We'll use the toJson(Object src, Appendable writer) method from the Gson class to convert a Java data type into JSON and store it in a file. The Gson() constructor creates a Gson object with default configuration: Gson gson = new Gson();

What does Gson to JSON do?

Gson (by Google) is a Java library that can be used to convert a Java object into JSON string. Also, it can used to convert the JSON string into equivalent java object.


2 Answers

You write all the users in same file C:\\file.json so just the last iteration of the loop saved.

You can convert the object List<User> into json and write it once (no needed loop)

Example:

try (Writer writer = new FileWriter("Output.json")) {     Gson gson = new GsonBuilder().create();     gson.toJson(users, writer); } 
like image 98
Roy Shmuli Avatar answered Sep 18 '22 12:09

Roy Shmuli


I was previously using outputStream.writeObject and Serializable with default writer/reader for saving object data. Because of problems with code sustainability I have been after something else. This is the result. That BufferedWriter is mandatory, otherwise write speed drops 8 times. Notice that UTF-8 declaration which is default encoding of Json. Not sure whether not declaring it is safe.

Example:

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

where Type for example:

Type type = new TypeToken<Map<String, Object>>() { }.getType(); 
like image 29
sonavolob Avatar answered Sep 16 '22 12:09

sonavolob