java - 如何使用 gson 创建一组键值对?
问题描述
我目前有这段代码,如何添加它以便我可以从 Gson 获取 JsonObject 以将其附加到现有的 Json 文件中?
private static void writeFile(File f, String w_username, String w_password) throws IOException{
Gson gson = new Gson();
JsonWriter writer = new JsonWriter(new FileWriter(f));
}
解决方案
JSON
结构不允许只append
在文件末尾添加更多数据。在这种情况下,更合适的可能是CSV
格式。
要解决您的问题,您需要将整个文件读取为JsonObject
,添加新的“键值”对并将其保存回来。
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Objects;
public class GsonApp {
public static void main(String[] args) throws IOException {
File store = Files.createTempFile("store", "json").toFile();
// Add two users
JsonFileAppender jsonFileAppender = new JsonFileAppender();
jsonFileAppender.appendToObject(store, "jon", "ewemn!32");
jsonFileAppender.appendToObject(store, "rick", "923djks");
// Print whole file
System.out.println(String.join("", Files.readAllLines(store.toPath())));
}
}
class JsonFileAppender {
private final Gson gson;
public JsonFileAppender() {
this.gson = new GsonBuilder().create();
}
public void appendToObject(File jsonFile, String username, String password) throws IOException {
Objects.requireNonNull(jsonFile);
Objects.requireNonNull(username);
Objects.requireNonNull(password);
if (jsonFile.isDirectory()) {
throw new IllegalArgumentException("File can not be a directory!");
}
JsonObject node = readOrCreateNew(jsonFile);
node.addProperty(username, password);
writeToFile(jsonFile, node);
}
private JsonObject readOrCreateNew(File jsonFile) throws IOException {
if (jsonFile.exists() && jsonFile.length() > 0) {
try (BufferedReader reader = new BufferedReader(new FileReader(jsonFile))) {
return gson.fromJson(reader, JsonObject.class);
}
}
return new JsonObject();
}
private void writeToFile(File jsonFile, JsonObject node) throws IOException {
try (FileWriter writer = new FileWriter(jsonFile)) {
gson.toJson(node, writer);
}
}
}
上面的代码打印:
{"jon":"ewemn!32","rick":"923djks"}
推荐阅读
- ansible - 执行 ansible include_tasks 直到满足某个条件(一种 while until 循环)
- git - 无法查看特定分支
- python-3.x - GAE Python 3:静态文件不在本地主机上加载,但在在线部署时加载
- javascript - Javascript 抓取 URL 参数并附加到所有页面
- python - 有没有办法让烧瓶异步
- android - 将 HashMap 类型的值转换为 String 失败
- odoo - 如何在odoo pdf报告中为超过一千的数字添加逗号?
- excel - 有没有办法根据列值的变化在 Excel 中使用 VBA 插入分页符,但在标题之后开始?
- postgresql - Knex.js for PostgreSQL 中具有不同 WHERE 子句的完全外连接
- javascript - 我在尝试检索表单时不断得到空结果