[英]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.