Мне нужно работать со следующим предварительно определенным запросом 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");
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());
Если вы готовы использовать библиотеку Google JSON (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
.
Это, безусловно, отличное решение! Я смог обновить некоторые значения JSON после этого кода. благодарю вас!