Обновить значение вложенного JSON в Java - PullRequest
0 голосов
/ 02 мая 2018

Я должен работать со следующим предопределенным JSON-запросом. Этот JSON хранится в локальном файле. Я хотел бы обновить значения пары элементов ("level-4b-1" и "level-4b-3"> "StartDate") в JSON и отправить запрос.


{
"level-1": {
  "level-2": {
     "level-3": {
        "level-4a": [
           "value-4a"
        ],
        "level-4b": [
           {
              "level-4b-1": "value-4b-1",
              "level-4b-2": "value-4b-2",
              "level-4b-3": {
                 "StartDate": "2017-11-13T00:00:00"
              }
           }
        ]
     },
     ...

У меня есть следующий код, но я не уверен, как углубиться в одну строку кода и затем обновить значение.

    JSONParser parser = new JSONParser();
    Object requestFileObj = parser.parse(new FileReader(context.getRealPath(localJsonFile)));
    JSONObject requestJsonObject =  (JSONObject) requestFileObj;

    if (requestJsonObject instanceof JSONObject) {

        JSONObject level1 = (JSONObject)chartRequestJsonObject.get("level-1");

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Если вы открыты для использования библиотеки JSON Google (https://github.com/google/gson),), вы можете обновить вложенные элементы и сохранить их, как показано в следующем примере кода:

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonObject;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.io.FileReader;
import java.nio.file.StandardOpenOption;

public class JsonUpdater {
  // Method to update nested json elements
  public void updateJson(String inputFile, String outputFile) {
      try {
          // Get the json content from input file
          String content = new String(Files.readAllBytes(Paths.get(inputFile)));

          // Get to the nested json object
          JsonObject jsonObj = new Gson().fromJson(content, JsonObject.class);
          JsonObject nestedJsonObj = jsonObj
                  .getAsJsonObject("level-1")
                  .getAsJsonObject("level-2")
                  .getAsJsonObject("level-3")
                  .getAsJsonArray("level-4b").get(0).getAsJsonObject();

          // Update values
          nestedJsonObj.addProperty("level-4b-1", "new-value-4b-1");
          nestedJsonObj.getAsJsonObject("level-4b-3").addProperty("StartDate", "newdate");

          // Write updated json to output file
          Files.write(Paths.get(outputFile), jsonObj.toString().getBytes(), StandardOpenOption.CREATE);
      } catch (IOException exception) {
          System.out.println(exception.getMessage());
      }
  }

  // Main
  public static void main(String[] args) {
    JsonUpdater jsonUpdater = new JsonUpdater();
    jsonUpdater.updateJson("test.json", "new.json");
  }
}

Приведенный выше код читает строку json из test.json, обновляет значения для level-4b-1 и StartDate (в пределах level-4b-3) и сохраняет обновленную строку json в new.json.

0 голосов
/ 02 мая 2018

JsonPath предоставляет удобный способ адресации узлов в документах json. JayWay - хорошая реализация Java.

С JayWay:

DocumentContext doc = JsonPath.parse(json);
doc.set("level-1.level-2.level-3.level-4b[0].level-4b-3.StartDate", Instant.now().toString());
System.out.println(doc.jsonString());
...