2015-09-14 6 views
0

Так что у меня проблемы с созданием Json-файла правильно. Что у меня есть: 1. Gson ЛИЭС 2. Попытка написать в Json нового пользователя, как это:Как правильно создать json-файл

public static void writeUserBD(String name, String surname, int age) { 
     //writing in a Json format 

     JSONObject writeOne = new JSONObject(); 
     JSONArray arr = new JSONArray(); 

     for(int i = 0; i< arr.size() ; i++) 
     { 
      writeOne.put("name", name); 
      writeOne.put("surname", surname); 
      writeOne.put("age", new Integer(age)); 
      arr.add(writeOne); 
      writeOne = new JSONObject(); 

     } 
     //creating dir&file and writing in it 
     try { 
      File dir = new File("Test"); 
      dir.mkdir(); 
      File f = new File("Test/TestUser.json"); 
      if (!dir.exists()) { 
       dir.mkdirs(); 
      } else if (!f.exists()) { 
       f.createNewFile(); 
      } 
      //here comes writing encoding problem ! ! ! 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f.getAbsoluteFile(), true), Charset.forName("UTF-8"))); 
      try { 
       bw.write(arr + " " + "\n"); 
      } finally { 
       bw.close(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

Но если я перезагрузить мое приложение и попытаться написать новый будет писать новый JSONObject и мой выход будет, как:

[{}] 
[{}] 

в этом случае я не могу разобрать мой файл JSON (для создания простой Логин) получаю ошибку им, как "unexcpected token [[]" Как я понял, это происходит becouse более 1 JSONObject в файле.

Так что мой вопрос: как я могу записать новые данные пользователей в файл JSON (даже если приложение было перезагружена) в нужном формате, что я могу pasre, чем /, например, [{}, {}, {}]

+0

([{}, {}, {}]) не является действительным JSON, и это [{}, {}, {}] – rkosegi

+0

как вы получаете [{}] [{}]. .. вы либо записываете его дважды, либо добавляете к текущему тексту в файле ... – Tschallacka

+0

@MichaelDibbets Im, получая это, если я перезагружу свое приложение и вводят новые данные. Любой вход создает [{}] Jsonobject следующим образом: – TheOriginalNickname

ответ

0

выходной код должен быть пустой массив, потому что вы никогда не добавить элемент в массив. Вы создаете новый массив и перебираете его. Но новый массив не имеет элементов, и поэтому код внутри цикла никогда не будет выполнен. Кроме того, вы хотите добавить нового пользователя только один раз и, следовательно, вам не нужен цикл.

Сначала вы должны прочитать файл, а затем добавить к нему нового пользователя и записать его обратно. Я создал простой пример для вас. Я раньше не использовал GSON, поэтому я уверен, что есть лучший способ сделать это, но он работает, тем не менее. Я использовал функцию try-with-resource и новый API-интерфейс ввода-вывода Java 7 и больше не обрабатывал исключения. Поэтому, если вы хотите обрабатывать исключения внутри метода, измените код соответствующим образом. Я не создал файловую структуру, поэтому вы тоже должны делать это самостоятельно.

public static void writeUserBD(final String name, final String surname, final int age) throws IOException { 
    final Path jsonFile = Paths.get("Test/TestUser.json"); 
    final JsonArray users = new JsonArray(); 

    // Read all existing users 
    if (Files.isRegularFile(jsonFile)) { 
     try (final JsonReader r = new JsonReader(Files.newBufferedReader(jsonFile))) { 
      r.beginArray(); 

      while (r.hasNext()) { 
       final JsonObject user = new JsonObject(); 

       r.beginObject(); 
       r.nextName(); 
       user.addProperty("name", r.nextString()); 
       r.nextName(); 
       user.addProperty("surname", r.nextString()); 
       r.nextName(); 
       user.addProperty("age", r.nextInt()); 
       r.endObject(); 
       users.add(user); 
      } 

      r.endArray(); 
     } 
    } 

    // Create the new user 
    final JsonObject user = new JsonObject(); 

    user.addProperty("name", name); 
    user.addProperty("surname", surname); 
    user.addProperty("age", age); 
    users.add(user); 

    // Write all users 
    try (final BufferedWriter w = 
      Files.newBufferedWriter(jsonFile, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) { 
     w.write(users.toString()); 
    } 
} 
1

Попробуйте

new FileOutputStream(f.getAbsoluteFile(), false) 

истинный параметр добавляет к текущему файлу, ложь должна создать новый один

+0

. Вероятно, ^^^ является причиной. Потому что нет разумного способа, которым код должен давать два массива без по крайней мере запятой и окружающим объектом или чем-то еще. – Tschallacka

+0

@MichaelDibbets Мне жаль плохое объяснение, но мой код не дает мне 2 выхода массивов, это был просто пример того, что произойдет, если я попытаюсь написать новые данные. В моем коде один вход = один массив – TheOriginalNickname

+0

@Yampeku создание нового файла для нового пользователя - это правильный способ работы с json? – TheOriginalNickname

Смежные вопросы