繁体   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