Java Заменить JsonNode строковым значением - PullRequest
0 голосов
/ 13 апреля 2019

Я нуб в Java и борюсь с преобразованиями типов.У меня есть объект JSON, как показано ниже:

   [  
       {  
        "A":{  
           "B":{  
              "C":"Message",
              "D":"FN1"
           }
        }
       }
    ] 

И я хочу преобразовать его следующим образом:

  [  
       {  
        "A":{  
           "B": "My String Message"
        }
       }
    ]

Я могу заменить старый узел JSON новым узлом JSON, но не могузамените его на TextNode, пробовал несколько неудачных опций, как показано ниже:

   JsonNode newNode = new TextNode("My String Message");
   ObjectNode nodeObj = (ObjectNode) jsonNode;
   nodeObj.removeAll();
   nodeObj.set(newNode);

1 Ответ

1 голос
/ 13 апреля 2019

У вас была небольшая проблема с вашим кодом.Когда вы добавляете новую текстовую запись, вы должны указать значение ключа, с которым хотите связать новый текстовый узел.Итак, эта строка:

nodeObj.set(newNode);

Просто нужно быть таким:

nodeObj.set("B", newNode);

Вот полный пример, который делает то, что вы показываете в своем вопросе, включая код, который вы предоставили, простоэто небольшое исправление:

public static void main(String... args) throws IOException {

    // Read in the structure provided from a text file
    FileReader f = new FileReader("/tmp/foox.json");
    ObjectMapper mapper = new ObjectMapper();
    JsonNode rootNode = mapper.readTree(f);

    // Print the starting structure
    System.out.println(rootNode);

    // Get the node we want to operate on
    ObjectNode jsonNode = (ObjectNode)rootNode.get(0).get("A");

    // The OPs code, with just the small change of adding the key value when adding the new String
    JsonNode newNode = new TextNode("My String Message");
    ObjectNode nodeObj = (ObjectNode) jsonNode;
    nodeObj.removeAll();
    nodeObj.set("B", newNode);

    // Print the resulting structure
    System.out.println(rootNode);
}

И полученный результат:

[{"A":{"B":{"C":"Message","D":"FN1"}}}]
[{"A":{"B":"My String Message"}}]

ОБНОВЛЕНИЕ: согласно обсуждению в комментариях, чтобы внести изменения, которые вы иллюстрируете, вы должны иметь доступ кObjectNode, связанный с ключом A. Именно этот ObjectNode связывает B с ObjectNode, содержащим C и D. Так как вы хотите изменить значение, с которым связан B (вы хотите, чтобы оно было связано с TextNode вместо ObjectNode)вам нужен доступ к ObjectNode, связанному с A. Если у вас есть только указатель на ObjectNode, содержащий C и D, вы не можете внести изменение, которое хотите внести.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...