2015-03-28 17 views
11

In meiner Web-Anwendung erfolgreich seine I-Daten in HTML-Tabelle mit Mybatis in der Anzeige. Jetzt möchte ich in einer JSON-Datei die Datensätze der Mysql-Tabelle speichern und eine Reihe von Benutzern zu erstellen, habe ich Gson, das Problem ist, dass nur ein Datensatz in der Datei gespeichert. Vielen Dank.
Hier das Ergebnis in file.json:Wie speichere ich Daten mit gson in einer JSON-Datei?

{"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

, weil Sie auf die gleiche Datei in jeder Schleifeniterationslatenzzeit gerade schreiben. Sie müssen die _list_ in die Datei schreiben, nicht jedes Element. –

+0

, wenn ich Sie verstehen, ich bewege die Zeile "JsonWriter writer = new JsonWriter (neue Filewriter (" C: \\ file.json "));" vor der Zeile für, aber das gleiche Ergebnis –

+0

Dann verstehst du nicht. Sie müssen die 'Liste' schreiben! Gson wird es für JSON ganz einfach selbst serialisieren. –

Antwort

23

Sie schreiben alle Benutzer in derselben Datei C:\\file.json so nur die letzte Iteration der gespeicherten Schleife.

können Sie wandeln das Objekt List<User> in json und schreiben Sie es einmal (nicht erforderlich Loop)

Beispiel:

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

danke für die Antwort, ich hatte alle Benutzer in der JSON-Datei, aber warum der Backslash mit Zeichenfolgen.Ich brauche nicht Backslashs.[ {\ ID: 1, \ "name \": \ "Nancy \"}, {\ "ID \": 2, "Detail": \ "Mike \"} ] –

+0

Wenn Sie es als vollständiges Objekt speichern, ohne die Zeichenfolge zu ändern, können Sie es einfach in Ihr Objekt konvertieren, aber es hängt von Ihrer Mission ab. –

+0

Haben Sie irgendeine Lösung über meinen ersten Vorschlag mit Schleifen? –

1

ich zuvor mit outputStream.writeObject und Serializable mit Standard-Schreib-/Lesegerät zum Speichern von Objektdaten. Wegen Problemen mit der Code-Nachhaltigkeit habe ich etwas anderes gesucht. Dies ist das Ergebnis. Dieser BufferedWriter ist obligatorisch, andernfalls fällt die Schreibgeschwindigkeit achtmal ab. Beachten Sie, dass die UTF-8-Deklaration default encoding of Json ist. Nicht sicher, ob es nicht sicher ist.

Beispiel:

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

wo Type zum Beispiel:

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

schnelle Lösung, um Ihren Code:

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

jedoch in dem Fall, dass Ihre User-Klasse sieht wie folgt aus :

public class User { 
    String id; 
    String name; 
} 

Dann brauchen Sie den Adapter nicht codieren, wie Gson der Lage ist, automatisch den JSON-Code für eine Klasse zu generieren, die nur hat Primitiven (Ints, Streicher, etc.). Ihr Code würde also wie @ roy-shmuli aussehen, aber nur, wenn Sie die Daten weglassen und nur das Array behalten, da die Liste komplett ohne Adapter generiert werden kann. Der Code JSON erzeugt würde wie folgt aussehen:

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

Hoffe, dass es den Anfängern hilft.

Verwandte Themen