首页 > 解决方案 > Gson - 为什么我的循环会弄乱我的 json 文件?

问题描述

这是我运行代码之前的“example.json”:

{
  "example1": {
    "example2": {
      "example3": 30
    }
  }
}

当我运行此代码时:

JsonManager.writeString("example", "example1", "example2", "example7", "70");

这个功能:

public static void writeString(String fileName, String ... objects) throws IOException {

    Path jsonFile = Paths.get("src/" + fileName + ".json");

    try (BufferedReader reader = Files.newBufferedReader(jsonFile);
         BufferedWriter writer = Files.newBufferedWriter(jsonFile, StandardOpenOption.WRITE)) {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        JsonObject value = gson.fromJson(reader, JsonObject.class);
        
        // Method 1:
        
        value.getAsJsonObject(objects[0]).getAsJsonObject(objects[1]).addProperty(objects[2], objects[3]); //
        
        // Method 2:
        
        String property = null;
        int i = 0;

        for (String s : objects) {
            i++;
            if (i == objects.length) {
                value.addProperty(property, s);
            }
            if (i == objects.length - 1) {
                property = s;
            } else {
                value = value.getAsJsonObject(s);
            }
        } //

        gson.toJson(value, writer);

    }

}

现在,上面函数中的方法 1 可以有意地对“example.json”执行此操作:

{
  "example1": {
    "example2": {
      "example3": 30,
      "example7": "70"
    }
  }
}

方法 2 对“example.json”执行此操作:

null"example1": {
    "example2": {
      "example3": 30,
      "example7": "70"
    }
  }
}

我不确定为什么会发生这种情况,我已经多次尝试修复它。

标签: javajsongsonwritetofile

解决方案


这里有两个错误:

  • 问题的实际原因:在最后一次执行循环时,value.addProperty调用,然后if下降并else执行块,导致您的结果。只需将 second 更改ifelse if或在 之后添加一个 break即可value.addProperty

  • 修复后这仍然无法正常工作,因为您正在覆盖value变量(您在方法 1 中没有这样做)。尝试第一个修复程序,看看会发生什么,您的文件中将包含“双 json”。修复很简单:只写原始值,而不是操作后的值。

JsonObject value = gson.fromJson(reader, JsonObject.class);
JsonObject originalValue = value;
...
gson.toJson(originalValue, writer);

推荐阅读