【发布时间】:2017-06-07 15:25:37
【问题描述】:
所以我最近的任务是创建一个实用程序,该实用程序允许通过 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()
}
}
我使用二维数组来允许用户在所述对象中添加具有任意数量值的不同对象。例如,您可以这样运行它:
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)) })
}
【问题讨论】:
-
catch (e: IOException = java.io.IOException)错误,应该是catch (e: IOException)。或者你可以完全删除 catch。 -
谢谢,会做出改变的。还有更多提示吗?
-
你需要先读取json,然后添加新元素,最后保存。
-
@KrisRoofe 添加新元素是我遇到的困难。我怎样才能让用户可以指定一个对象来添加新元素?