簡體   English   中英

Java | GSON | 將JSON對象添加到現有的JSON文件中

[英]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文件中將其替換,以便稍后再檢索。

如果您可以為這種應用程序推薦更好的內存類型,我願意接受。 但是以后它也應該與數據庫兼容。 后來我也想處理數據庫。

到目前為止,我還不知道如何執行此操作,因為我仍處於編程的開始。 我一直在尋找可以涵蓋該主題的帖子,但是我還沒有真正發現我了解的任何內容。

您可以先沒有JsonParserJsonWriter然后使用Gson的fromJson(..)toJson(..)因為您當前的Json格式很容易映射為條目POJO的映射。

對於大量數據,使用JsonParserJsonWriter創建一些復雜的實現可能會更有效,但是在這一點上,您應該已經研究了如何持久存儲到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應用程序甚至台式機應用程序中使用這種通用架構,以獨立於后端服務器獲得前端層:

前端將使用JSON或XML格式通過后端REST API通過HTTP請求與服務器通信。 在現實生活中,它們在物理上是分開的,但是只創建了兩個在不同端口上運行的不同Java項目。

  1. 對於后端,只需按照教程操作即可啟動並運行REST API服務器。 設置MVC模式:控制器層,服務層,存儲庫層,模型層,dto層等。對於您的特定模型,我建議您執行以下操作:

selected_date:日期

輸入:字符串映射

大小:整數

  1. 在使用Java FX的前端項目上,只需重新使用您已經編寫的代碼,並根據需要添加一些CSS。 使用組件操作來調用后端REST API,以從日期選擇器或您要執行的任何操作中創建,檢索,更新和刪除數據。

您將把Java對象永久地轉換為JSON字符串,我建議您使用直接執行此操作的Gson庫或Jackson庫,並且不需要手動構建JsonObject。 如果仍然要將JSON寫入文件,請使用上述庫將java對象轉換為字符串(這是一個以JSON格式寫入對象的字符串),然后將該字符串寫入文件。 但是我堅信,如果您實現數據庫,它將有更多實踐。

希望能幫助到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM