如何将新的 JSONObject 添加到 json 文件中的现有 JSONArray

How to add new JSONObjects to existing JSONArray in json file

我无法将文本字段中的数据保存到 json 文件中。下面这段代码工作得很好,但在重新启动我的应用程序并尝试添加新的 obj2 后,以前的数据正在删除。我尝试使用追加,但随后它保存在 json 文件中的 [] 之外。我的第二个问题是 prettyWriting 我的数据在 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("");
}

根据 Alex Rudenko 的评论: 1.I不知道我是否重读了arr,我在私有声明下面这样创建它。

JSONArray arr = new JSONArray();

2.This是我的检查方法。

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. 很有可能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);
    }
}
}