将JSON对象添加到现有的JSON文件

所以最近我的任务是创建一个实用程序,它将允许通过gson库轻松地将JSON添加到.json文件。 我已经在Kotlin中编写了这个代码:

fun addObject(filePath: String, name: String, values: Array<Array<String>>) { try { var writer: JsonWriter = JsonWriter(FileWriter(File(filePath))) writer.beginObject() writer.name(name) writer.beginObject() for(item in values){ writer.name(item[0]).value(item[1]) } writer.endObject() writer.endObject() writer.close() println("[JSONUtil] Wrote object successfully!") } catch (e: IOException) { e.printStackTrace() } } 

我使用了一个2维数组来允许用户在所述对象中添加具有任意数量值的不同对象。 例如,你会像这样运行它:

 addObject("C:\\Users\\Test\\Desktop\\JsonUtility\\output.json", "GENERAL", arrayOf(arrayOf("POS_X","2"), arrayOf("POS_Y","4"))) 

这将创建以下JSON:

 {"GENERAL":{"POS_X":"2","POS_Y":"4"}} 

这是它的目的和工作原理,我的问题是,再次运行该函数时,它会完全覆盖文件中的前一个JSON,这显然是不好的。

我的问题是:

  • 我怎样才能在整个文件或特定点上添加新的JSON对象,例如“addObject(”GENERAL“,…)”?

  • 我怎样才能使这个更好?

我对Kotlin相当陌生,而且大部分都是用Java编写的,所以Java解决方案很好,因为我相信我可以将其转换。

提前致谢!

编辑:新代码,不知道如何实现它:

 fun UpdateJson(path: String, name: String, value: String){ var gson = Gson() var reader: FileReader = FileReader(File(path)) val type = object : TypeToken<Map<String, String>>() {}.type println("Type: " + type.toString()) println("Existing Json: ${gson.fromJson<Map<String,String>> (JsonReader(reader), type)}") var existingJson: Map<String, String> = gson.fromJson<Map<String,String>>(JsonReader(reader), type) existingJson.put(name, value) FileWriter(File(path)).use({ writer -> writer.write(gson.toJson(existingJson)) }) } 

最简单的方法是,像@ KrisRoofe建议的那样,阅读json,然后添加一个元素。 我会通过将文件中现有的json转换为一个Map来做到这一点。 既然你实际上并不关心现有的json,那么你所要做的就是向该Map添加一个新的条目。 一旦你这样做,只需将新的地图写入文件。 你可以这样做:

 public class UpdateJson { public static void main(String[] args) throws IOException { addObject("example.json", "GENERAL", arrayOf(arrayOf("POS_X","2"), arrayOf("POS_Y","4"))); } private static void addObject(String fileName, String newObjName, String newObjValue) throws IOException { Gson gson = new Gson(); Type type = new TypeToken<Map<String, String>>(){}.getType(); Map<String, String> existingJson = gson.fromJson(new JsonReader(new FileReader(new File(fileName))), type); existingJson.put(newObjName, newObjValue); try (FileWriter writer = new FileWriter(new File(fileName))) { writer.write(gson.toJson(existingJson)); } } private static String arrayOf(String s1, String s2) { return "[" + s1 + ", " + s2 + "]"; } } 

编辑:上面的解决方案是一个Java解决方案。 类似Kotlin似乎有一个问题。

  1. 这个堆栈溢出问题通过使用object:有一个解决方法object:
  2. 此外,请注意,要使用Kotlin进行反射,根据Kotlin文档 “

编辑2:提供Kotlin答案:

 fun main(args: Array<String>) { addObject("example.json", "GENERAL", arrayOf(arrayOf("POS_X", "2"), arrayOf("POS_Y", "4"))) } fun addObject(path: String, name: String, value: String) { val gson = Gson() val reader: FileReader = FileReader(File(path)) val type = object : TypeToken<Map<String, String>>() {}.type System.out.println("Type: " + type.toString()) val existingJson = gson.fromJson<Map<String, String>>(JsonReader(reader), type) System.out.println("Existing Json: ${existingJson}") val newJsonMap = existingJson.plus(Pair(name, value)) FileWriter(File(path)).use( { writer -> writer.write(gson.toJson(newJsonMap)) } ) } fun arrayOf(s1: String, s2: String): String { return "[$s1, $s2]" }