Как добавить новые JSONObjects в существующий JSONArray в json файле - PullRequest
0 голосов
/ 30 апреля 2020

Я застрял с сохранением данных в файле json из текстовых полей. Этот код ниже работает довольно хорошо, но после перезапуска моего приложения и попытки добавить новый obj2, предыдущие данные удаляются. Я пытался использовать append, но затем он сохранялся из [] в json файле. Вторая проблема заключается в том, что мои данные записываются в файл json, я не могу реализовать этот метод в своем коде, не знаю почему. Если у вас есть идея, как ее решить, я был бы признателен.

JSONObject obj1 = new JSONObject();
JSONObject obj2 = new JSONObject();
obj1.put("name", tfNameOfMedicine.getText());
obj1.put("amount",tfAmountOfMedicine.getText());
obj2.put("Medicine", obj1);
    if(!checkIfInBase()) {
        arr.add(obj2);
        try (FileWriter Data = new FileWriter("Data.JSON")) {

            Data.write(arr.toJSONString());
            Data.flush();
            JOptionPane.showMessageDialog(null, "Saved!");
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Error");

        }
    }else{JOptionPane.showMessageDialog(null, "This medicine exist in data base");}

    tfAmountOfMedicine.setText("");
    tfNameOfMedicine.setText("");
}

Согласно комментарию Алекса Руденко: 1. Я не знаю, перечитал ли я arr, я создаю его так, как показано ниже, в частной декларации.

JSONArray arr = new JSONArray();

2. Это мой метод проверки.

private boolean checkIfInBase() {
    JSONObject obj1 = new JSONObject();
    JSONObject obj2 = new JSONObject();
    int size = arr.size();
    obj1.put("name", createMedicine().getName());
    obj1.put("amount", createMedicine().getAmount());
    obj2.put("Medicine", obj1);
    boolean a = false;
    for (int i = 0; i < size; i++) {
        if (obj1.equals(arr.get(i))) {
            a = true;
            break;
        }
    }
    return a;
}

3. я использую json .simple

1 Ответ

0 голосов
/ 30 апреля 2020
  1. Весьма вероятно, что json .simple не имеет функции красивой печати, и он довольно старый, поэтому я предлагаю переключиться на любую другую библиотеку. В приведенном ниже примере я буду использовать org.json

  2. Вам необходимо перечитать файл json и инициализировать переменную arr.

  3. Вы можете проверить равенство ваших JSON объектов в массиве, преобразовав их в строки и сравнив.

  4. Исправьте перезапись вашего JSON файла.

import java.io.*;
import org.json.JSONTokener;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class JsonExample {

private static JSONArray initArray(String jsonFileName) throws IOException, JSONException {
    String json = "";
    File jsonFile = new File(jsonFileName);
    if (!jsonFile.exists()) {
        return new JSONArray();
    }

    try (BufferedReader reader = new BufferedReader(new FileReader(jsonFile))) {
        String line;
        while ((line = reader.readLine()) != null) {
            json += line;
        }
    }
    JSONTokener tokener = new JSONTokener(json);
    JSONArray readArr = new JSONArray(tokener);
    System.out.println("Read arr: " + readArr.toString());
    return readArr;
}

private static boolean isInDB(JSONObject obj, JSONArray arr) throws JSONException {
    for (int i = 0; i < arr.length(); i++) {
        JSONObject item = arr.getJSONObject(i);
        if (obj.toString().equals(item.toString())) {
            return true;
        }
    }
    return false;
}

private static JSONArray saveArray(JSONArray arr, String jsonFileName) throws JSONException, IOException {
    try (FileWriter Data = new FileWriter(jsonFileName)) {
        Data.write(arr.toString(4)); // setting spaces for indent
    }
    return arr;
}

// main method
public static void main(String[] args) throws Exception {
    JSONArray arr = initArray("DataMedicine.json");

    JSONObject obj = new JSONObject();
    obj.put("name", "Antivirin");
    obj.put("amount", 15);
    JSONObject medicine = new JSONObject();
    medicine.put("medicine3", obj);

    if (!isInDB(medicine, arr)) {
        arr.put(medicine);
        saveArray(arr, "DataMedicine.json");
    } else {
        System.out.println("Already exists in DB: " + obj);
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...