Есть ли способ легко обновить узел JSON с помощью ObjectMapper Джексона?

Учитывая этот JSON, прочитанный из файла:

{
    "Book": "Test",
    "Subscription": [{
        "RateIt": [{
            "Id": "1234",
            "Size": "XL",
            "RateMe": [{
                "id": "5678",
                "Pages": ""
            }],
            "Test_Demo": null
        }],
        "DemoID": "test1111",
        "subNumber": "9999"

    }],
    "Author_FirstName": "Test"
}

Я попытался обновить поле DemoID другим значением следующим образом:

ObjectMapper mapper = new ObjectMapper();
JsonNode requestParams = mapper.readTree(new File("src/test/resources/myFile.json"));
JsonNode subscriptionPath = requestParams.at("/Subscription");
System.out.println(subscriptionPath ); //value was retrieved OK
((ObjectNode) subscriptionPath).put("DemoID", "test0000"); //error on this line

Но получил исключение:

java.lang.ClassCastException: com.fasterxml.jackson.databind.node.TextNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

Я также попытался использовать DemoIDpath вместо этого, но получил то же исключение:

JsonNode idPath = requestParams.at("/Subscription/0/DemoID");//path was found OK
((ObjectNode) idPath).put("DemoID", "test0000"); // error on this line

Что я делаю не так с использованием ObjectNode?

Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Subscription — это массив. Вы можете увидеть это лучше с правильным форматированием:

{
    "Book": "Test",
    "Subscription": [
        {
            "RateIt": [
                {
                    "Id": "1234",
                    "Size": "XL",
                    "RateMe": [
                        {
                            "id": "5678",
                            "Pages": ""
                        }
                    ],
                    "Test_Demo": null
                }
            ],
            "DemoID": "test1111",
            "subNumber": "9999"
        }
    ],
    "Author_FirstName": "Test"
}

Измените код на:

 ((ObjectNode) subscriptionPath.get(0)).put("DemoID", "test0000");

Это отлично работает @PeterMmm. Почему get(0) хотя есть только один узел Subscription? Это то, чего мне не хватало.

The man 09.04.2022 21:32

Другие вопросы по теме