Jacksonを使用して、深い階層のJSONの値を変更するには、次の手順に従います。
- JSON文字列をJavaオブジェクトにデシリアライズします。
- 必要な値を変更します。
- 変更したJavaオブジェクトをJSON文字列にシリアライズします。
Jacksonの JsonNode を使ってJSONの特定のキーを取得しようとしたとき、そのキーが存在しない場合は JNullPointerException が発生します。このため、キーが存在するかどうかを事前にチェックすることが重要です。
以下の例で rootNode.get("a").get("b") のようなコードを使用すると、もしキー "a" や "b" が存在しない場合に NullPointerException が発生します。したがって、キーが存在するかどうかをチェックするために has メソッドを使用することが推奨されます。
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class Main {
public static void main(String[] args) throws Exception {
// JSON文字列
String json = "{\"a\":{\"bd\":{\"c\":123}}}";
// JacksonのObjectMapperを作成
ObjectMapper mapper = new ObjectMapper();
// JSON文字列をJavaオブジェクトにデシリアライズ
JsonNode rootNode = null;
try {
rootNode = mapper.readTree(json);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
try {
// キーの存在をチェックしてから値を変更
if (rootNode.has("a") && rootNode.get("a").has("b")) {
((ObjectNode) rootNode.get("a").get("b")).put("c", 456);
} else {
System.out.println("Key 'a' or 'b' does not exist.");
}
} catch (Exception e) {
e.printStackTrace();
}
// 変更後のJSON文字列を取得
String updatedJson = null;
try {
updatedJson = mapper.writeValueAsString(rootNode);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
System.out.println(updatedJson);
}