#java #json
#java #json
Вопрос:
Я использую внешний веб-сервис и получаю ответ JSON. В этом ответе есть объект «entities», содержащий в себе несколько массивов, с именем перед каждым массивом.
Я хочу добавить имя перед массивом в сам объект массива.
Например, это исходный ответ:
{
"entities": {
"entity": [
{
"confidence": 1,
"value": "user",
"type": "value"
},
{
"confidence": 1,
"value": "insurance form",
"type": "value"
}
],
"ui_page_step": [
{
"confidence": 1,
"value": "step 1",
"type": "value"
}
],
"userrole_ano": [
{
"confidence": 0.96535832252792,
"value": "anonymous user"
}
]
}
}
Мне нужно преобразовать его в:
{
"entities": {
"entity": [
{
"name": "entity",
"confidence": 1,
"value": "user",
"type": "value"
},
{
"name": "entity",
"confidence": 1,
"value": "insurance form",
"type": "value"
}
],
"ui_page_step": [
{
"name": "ui_page_step",
"confidence": 1,
"value": "step 1",
"type": "value"
}
],
"userrole_ano": [
{
"name": "userrole_ano",
"confidence": 0.96535832252792,
"value": "anonymous user"
}
]
}
}
Как я могу преобразовать исходный ответ в желаемый в Java?
Комментарии:
1. покажите некоторые попытки, которые вы сделали до сих пор
2. Почему вы хотите редактировать JSON таким образом? Какая-либо конкретная причина?
3. Какую библиотеку вы используете для десериализации / сериализации JSON?
4. Стороннему приложению это нужно именно так в качестве ответа. У меня нет кода, библиотека еще не выбрана, так как я не знаю, с чего начать.
5. Используйте JsonParser() . Проанализируйте его и добавьте свое «имя» через итератор в «entities». geeksforgeeks.org/parse-json-java
Ответ №1:
Вот (одно из нескольких возможных) решений:
-
Он использует библиотеку Jackson для разбора Json в java
Map
, которая (относительно) проще для навигации и изменения, чем JSONObject. -
метод
putCollectionNamesInsideEntries()
предполагает одну корневую"entities"
запись, которая имеет несколько коллекций в качестве значений. он перебирает их все, добавляя"name"
запись с именем коллекции. -
карта сериализуется обратно в Json (и отправляется
System.out
)import java.io.*; import java.nio.file.*; import java.util.*; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonTest { public static void main(String[] args) { try (InputStream is = Files.newInputStream(Paths.get("C:/temp/test.json"))) { ObjectMapper mapper = new ObjectMapper(); // deserialize json into map Map<String, Object> map = (Map<String, Object>)mapper.readValue(is, Map.class); putCollectionNamesInsideEntries(map); // serialize map into json mapper.writeValue(System.out, map); } catch (Exception e) { e.printStackTrace(); } } private static void putCollectionNamesInsideEntries(Map<String, Object> map) { // get root "entities" entry Map<String, Object> entitiesMap = (Map<String, Object>)map.get("entities"); for (Map.Entry<String, Object> entitiesEntry : entitiesMap.entrySet()) { // iterate over collection entries if (entitiesEntry.getValue() instanceof Collection) { Collection coll = (Collection)entitiesEntry.getValue(); // iterate over entries in collection for (Object collEntry : coll) { if (collEntry instanceof Map) { // add "name" with ame of collection (key entry under "entries") ((Map<String, Object>)collEntry).put("name", entitiesEntry.getKey()); } } } } } }
Комментарии:
1. Зачем вам обходить все эти вызовы? ObjectMapper имеет действительно классные методы записи для записи непосредственно в JsonNode-> ArrayNode все, что нам нравится.
2. @MS90, я буду рад, если вы покажете, как легко работать с JsonMode и ArrayNode. Мне было сложно и неинтуитивно работать с этим api