如何将新的 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
很有可能json.simple没有漂亮的打印功能,而且比较老,建议换个库。在下面的示例中,我将使用 org.json
您需要重新读取 json 文件并初始化 arr
变量。
您可以通过将对象转换为字符串并进行比较来检查数组中的 JSON 对象是否相等。
修复 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);
}
}
}
我无法将文本字段中的数据保存到 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
很有可能json.simple没有漂亮的打印功能,而且比较老,建议换个库。在下面的示例中,我将使用
org.json
您需要重新读取 json 文件并初始化
arr
变量。您可以通过将对象转换为字符串并进行比较来检查数组中的 JSON 对象是否相等。
修复 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);
}
}
}