更新json数组文件中的值

时间:2019-06-26 11:36:12

标签: java gson

我正在读取一个包含json数组的json文件,我正在尝试更新jason数组中所有对象中的某些键值,并将新的更新后的json数组写入另一个文件中。

其中包含以下json数组的文件:

 [
      {
        "info": "old text"
        "sometext": "old text",
        "Id": 2,
        "No": 12,
      },
      {
        "info": "old text"
        "sometext": "old text",
        "Id": 68,
        "No": 22,
      },
      {
        "info": "old text"
        "sometext": "old text",
        "Id": 87,
        "No": 15,
      }

 ]

我想更新json数组中所有对象中的info和sometext键的值,以便使用更新的json数组到新文件的输出为(这是我希望通过我的输出实现的代码):

 [
      {
        "info": "new text"
        "sometext": "new text",
        "Id": 2,
        "No": 12,
      },
      {
        "info": "new text"
        "sometext": "new text",
        "Id": 68,
        "No": 22,
      },
      {
        "info": "new text"
        "sometext": "new text",
        "Id": 87,
        "No": 15,
      }

 ]

到目前为止,这是我的代码:

final String JSON_PATH = "old.json";
final String JSON_PATH1 = "new.json";

BufferedWriter bw = new BufferedWriter(new FileWriter(JSON_PATH1));
BufferedReader br = new BufferedReader(new FileReader(JSON_PATH));
JsonParser parser = new JsonParser();
JsonArray arrayObj = parser.parse(br).getAsJsonArray();


for(int i=0; i < arrayObj.size();i++) {
    JsonObject burObj = arrayObj.get(i).getAsJsonObject();
    String  old_info = burObj.get("info").getAsString();
    String  old_sometext = burObj.get("sometext").getAsString();
    burObj.addProperty(NewTextGen(old_info), "info");
    burObj.addProperty(NewTextGen(old_sometext), "sometext");
    burObj.remove(old_info);
    burObj.remove(old_sometext);
    Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
    gson.toJson(arrayObj, new JsonWriter(bw));
}
  

运行此代码时,我得到新旧值的乱码输出   而不是我想要的输出。

乱码输出:

 [
      {
        "info": "old text"
        "sometext": "old text",
        "info": "new text"
        "sometext": "new text",
        "Id": 2,
        "No": 12,
      },
      {
        "info": "old text"
        "sometext": "old text",
        "info": "new text"
        "sometext": "new text",
        "Id": 68,
        "No": 22,
      },
      {
        "info": "old text"
        "sometext": "old text",
        "info": "new text"
        "sometext": "new text",
        "Id": 87,
        "No": 15,
      },
      {
        "info": "old text"
        "sometext": "old text",
        "info": "new text"
        "sometext": "new text",
      }

 ]

请注意旧文本和新文本只是伪文本,而不是实际文本,与NewTextGen()伪方法相同,因为我只是想知道自己是什么我的代码做错了


更新 解决了我的问题,查看答案

3 个答案:

答案 0 :(得分:0)

您将在每次迭代中编写整个“ arrayObj”。可能是打算写出“ burObj”。

gson.toJson(burObj, new JsonWriter(bw));

答案 1 :(得分:0)

您可以这样做,

JSONObject json =  jsonArray.getJSONObject(i);
json.put("info", "new text");

这里JSONObject将具有每个json和json.put(key,value)将根据密钥放置值

答案 2 :(得分:0)

我解决了我的问题

经过反复的反复试验,结果发现我需要在循环中创建BufferedWriter,在其中循环遍历json数组中对象的元素。另外,我还需要最后冲洗()BufferedWriter。完全不需要.remove()。

final String JSON_PATH = "old.json";
final String JSON_PATH1 = "new.json";

BufferedWriter bw = new BufferedWriter(new FileWriter(JSON_PATH1));
BufferedReader br = new BufferedReader(new FileReader(JSON_PATH));
JsonParser parser = new JsonParser();
JsonArray arrayObj = parser.parse(br).getAsJsonArray();


for (int i = 0; i < arrayObj.size(); i++) {

     JsonObject burObj = arrayObj.get(i).getAsJsonObject();

     burObj.getAsJsonObject().addProperty("info", NewTextGen(burObj.get("info").getAsString());
     burObj.getAsJsonObject().addProperty("sometext", NewTextGen(burObj.get("sometext").getAsString());

     Gson gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
     FileWriter fr = new FileWriter(JSON_PATH1);
     BufferedWriter bw = new BufferedWriter(fr);
     gson.toJson(arrayObj, new JsonWriter(bw));
     bw.flush();


    }