2015-03-28 10 views
11

W mojej aplikacji internetowej udało mi się wyświetlić dane w tabeli html za pomocą mybatis. Teraz chcę zapisać rekordy tabeli Mysql w pliku json i utworzyć tablicę użytkowników, użyłem Gsona, problem polega na tym, że tylko jeden zapis został zapisany w pliku. Dzięki.
Oto wynik w file.json:Jak zapisać dane z gsonem w pliku 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

ponieważ piszesz do tego samego pliku w każdej iteracji pętli. Musisz napisać _list_ do pliku, a nie do każdego elementu. –

+0

jeśli Cię rozumiem, przenoszę linię "JsonWriter writer = new JsonWriter (new FileWriter (" C: \\ file.json "));" przed wersją dla, ale ten sam wynik –

+0

Wtedy nie rozumiesz. Musisz napisać 'list'! Gson serializuje go do JSON-u, sam w sobie jest w porządku. –

Odpowiedz

23

Piszesz wszystkich użytkowników, w tym samym pliku C:\\file.json tak właśnie ostatniej iteracji pętli zapisany.

można konwertować obiekt List<User> do json i zapisać go raz (nie potrzebne pętla)

Przykład:

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

dzięki za odpowiedź, miałem wszystkich użytkowników w pliku json, ale dlaczego backslash z ciągami.Nie muszę krzyżyk."[ {\" id \ ": 1, \" nazwa \ ": \" Nancy \ "}, {\" id \ ": 2, \" szczegóły \ ": \" Mike \ "} ]" –

+0

Jeśli zapiszesz go jako pełny obiekt bez zmiany łańcucha, możesz łatwo przekonwertować go z powrotem na obiekt, ale zależy to od twojej misji –

+0

czy masz jakieś rozwiązanie dotyczące mojej pierwszej sugestii z zapętleniem? –

1

byłem poprzednio używając outputStream.writeObject i Serializable z domyślnym scenarzysta/czytelnika do zapisywania danych obiektu. Z powodu problemów z utrzymaniem stabilności kodu byłem po czymś innym. To jest wynik. To BufferedWriter jest obowiązkowe, w przeciwnym razie prędkość zapisu spada 8 razy. Zauważ, że deklaracja UTF-8 to default encoding of Json. Nie wiem, czy nie ogłosić, że jest bezpieczny.

Przykład:

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

gdzie Type na przykład:

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

Szybkie poprawki do kodu:

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

Jednak w przypadku, gdy klasa użytkownika wygląda tak :

public class User { 
    String id; 
    String name; 
} 

Następnie nie trzeba kodować adaptera, ponieważ Gson jest w stanie automatycznie wygenerować kod JSON dla klasy, która ma tylko prymitywy (int, ciągi itp.). Twój kod będzie wyglądał jako @ roy-shmuli, ale tylko wtedy, gdy pominiesz dane i zachowasz tylko tablicę, ponieważ List może zostać całkowicie wygenerowany bez adaptera. Wygenerowany kod JSON będzie wyglądał następująco:

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

Mam nadzieję, że pomaga początkującym.

Powiązane problemy