Как добавить имя перед массивом в самом объекте массива в ответе JSON?

#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:

Вот (одно из нескольких возможных) решений:

  1. Он использует библиотеку Jackson для разбора Json в java Map , которая (относительно) проще для навигации и изменения, чем JSONObject.

  2. метод putCollectionNamesInsideEntries() предполагает одну корневую "entities" запись, которая имеет несколько коллекций в качестве значений. он перебирает их все, добавляя "name" запись с именем коллекции.

  3. карта сериализуется обратно в 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