[英]Java | GSON | Add JSON objects to excisting JSON-File
我目前已經開始一個日記項目,以自學如何用Java編寫代碼。 該項目具有我使用JavaFX實現的圖形界面。
我想將數據寫入JSON文件,然后將其輸入兩個文本字段和一個滑塊。 這樣的JSON條目應如下所示:
{
"2019-01-13": {
"textfield1": "test1",
"textfield2": "test2",
"Slider": 2
}
}
我已經創建了一個類,可以通過JSONWriter傳遞和檢索值。 該類如下所示:
public class Entry {
private String date, textfield1, textfield2;
private Integer slider;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getTextfield1() {
return textfield1;
}
public void setTextfield1(String textfield1) {
this.textfield1 = textfield1;
}
public String getTextfield2() {
return textfield2;
}
public void setTextfield2(String textfield2) {
this.textfield2 = textfield2;
}
public Integer getSlider() {
return slider;
}
public void setSlider(Integer slider) {
this.slider= slider;
}
}
JSONWriter的代碼如下所示:
void json() throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonWriter writer = new JsonWriter(new FileWriter("test.json",true));
JsonParser parser = new JsonParser();
Object obj = parser.parse(new FileReader("test.json"));
JsonObject jsonObject = (JsonObject) obj;
System.out.println(jsonObject);
writer.beginObject();
writer.name(entry.getDate());
writer.beginObject();
writer.name("textfield1").value(entry.getTextfield1());
writer.name("textfield2").value(entry.getTextfield2());
writer.name("Slider").value(entry.getSlider());
writer.endObject();
writer.endObject();
writer.close();
}
該日期是從日期選擇器中獲取的。 稍后,我想按日期過濾來自Json文件的數據,並將包含的對象(文本字段1,textfiel2,滑塊)轉移到相應的字段中。
如果可能,我還要嘗試覆蓋日期的對象。 這意味着,如果日期條目已經存在,並且我想更改條目中的某些內容,則應在JSON文件中將其替換,以便稍后再檢索。
如果您可以為這種應用程序推薦更好的內存類型,我願意接受。 但是以后它也應該與數據庫兼容。 后來我也想處理數據庫。
到目前為止,我還不知道如何執行此操作,因為我仍處於編程的開始。 我一直在尋找可以涵蓋該主題的帖子,但是我還沒有真正發現我了解的任何內容。
您可以先沒有JsonParser
和JsonWriter
然后使用Gson的fromJson(..)
和toJson(..)
因為您當前的Json格式很容易映射為條目POJO的映射。
對於大量數據,使用JsonParser
和JsonWriter
創建一些復雜的實現可能會更有效,但是在這一點上,您應該已經研究了如何持久存儲到db。
POJO易於操作,以后可以很容易地持久化到db中-例如,如果您決定使用僅帶有少量注釋的JPA
技術。
參見下面的簡單示例:
@Test
public void test() throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
// Your current Json seems to be a map with date string as a key
// Create a corresponding type for gson to deserialize to
// correct generic types
Type type = new TypeToken<Map<String, Entry>>() {}.getType();
// Check this file name for your environment
String fileName = "src/test/java/org/example/diary/test.json";
Reader reader = new FileReader(new File(fileName));
// Read the whole diary to memory as java objects
Map<String, Entry> diary = gson.fromJson(reader, type);
// Modify one field
diary.get("2019-01-13").setTextfield1("modified field");
// Add a new date entry
Entry e = new Entry();
e.setDate("2019-01-14");
e.setScale(3);
e.setTextfield1("Dear Diary");
e.setTextfield1("I met a ...");
diary.put(e.getDate(), e);
// Store the new diary contents. Note that this one does not overwrite the
// original file but appends ".out.json" to file name to preserver the original
FileWriter fw = new FileWriter(new File(fileName + ".out.json"));
gson.toJson(diary, fw);
fw.close();
}
這應該導致test.json.out.json
類似:
{
"2019-01-13": {
"textfield1": "modified field",
"textfield2": "test2",
"Slider": 2
},
"2019-01-14": {
"date": "2019-01-14",
"textfield1": "Dear Diary",
"textfield2": "I met a ...",
"Slider": 3
}
}
請注意,我對此也沒有做任何假設:
// Just in case you meant to map "Slider" in Json as "scale"
@SerializedName("Slider")
private Integer scale;
我會給您一些一般性的建議,讓您更深入。
首先,我建議您在Web應用程序甚至台式機應用程序中使用這種通用架構,以獨立於后端服務器獲得前端層:
前端(如果需要,請使用Java Fx)。 教程: http : //www.mastertheboss.com/jboss-frameworks/resteasy/rest-services-using-javafx-tutorial
后端(Java 1.8,Springboot,MySQL數據庫)。 示例:使用該堆棧有大量示例和教程,我推薦mykong或baeldung博客。
前端將使用JSON或XML格式通過后端REST API通過HTTP請求與服務器通信。 在現實生活中,它們在物理上是分開的,但是只創建了兩個在不同端口上運行的不同Java項目。
selected_date:日期
輸入:字符串映射
大小:整數
您將把Java對象永久地轉換為JSON字符串,我建議您使用直接執行此操作的Gson庫或Jackson庫,並且不需要手動構建JsonObject。 如果仍然要將JSON寫入文件,請使用上述庫將java對象轉換為字符串(這是一個以JSON格式寫入對象的字符串),然后將該字符串寫入文件。 但是我堅信,如果您實現數據庫,它將有更多實踐。
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.