Java: HashMap во вложенный объект JSON

Пытаюсь понять, как создать вложенный JSON на основе HashMap. В основном у меня есть список HashMap, в котором есть неуникальные пары ключ / значение. И мне нужно превратить этот список HashMap в уникальный объект JSON.

Вот пример того, что я пытаюсь описать: Список HashMap выглядит так:

[
    {PERIOD: 201801, ID: 12345},
    {PERIOD: 201801, ID: 12346},
    {PERIOD: 201801, ID: 12347},
    {PERIOD: 201802, ID: 12345},
    {PERIOD: 201802, ID: 12347},
    {PERIOD: 201803, ID: 12345}, 
]

И я бы хотел, чтобы мой результат был:

{
    "NAME": "Results",
    "DETAILS": [
        {
            "PERIOD": 201801,
            "DETAILS": [
                { "ID": 12345 },
                { "ID": 12346 },
                { "ID": 12347 }
        },
        {
            "PERIOD": 201802,
            "DETAILS": [
                { "ID": 12345 },
                { "ID": 12347 }
        },
        {
            "PERIOD": 201803,
            "DETAILS": [
                { "ID": 12345 }
        }
    ] 
}

Одно предостережение заключается в том, что пара ключ / значение в HashMap может быть любым количеством элементов, а не только двумя, как я описал в примере выше. Я пробовал выполнять рекурсивную функцию, но все время натыкаюсь на стену.

Обновлено: это не дубликат этот вопрос. Я знаю, как сериализовать HashMap в JsonObject с помощью этих методов. Я делал это несколько раз. Я спрашиваю, как логически анализировать данные, находящиеся в HashMap, и создавать JsonObject на основе этой логики.

Изменить 2: Пример нескольких уровней:

[
  {PERIOD: 201801, ID: 12345, MANAGER: "Dave"},
  {PERIOD: 201801, ID: 12345, MANAGER: "Jill"},
  {PERIOD: 201801, ID: 12346, MANAGER: "Dave"},
  {PERIOD: 201801, ID: 12347, MANAGER: "Jon"},
  {PERIOD: 201802, ID: 12345, MANAGER: "Rob"},
  {PERIOD: 201802, ID: 12347, MANAGER: "Dave"},
  {PERIOD: 201803, ID: 12345, MANAGER: "Bailey"}, 
]

А вот и JSON:

{
"NAME": "Results",
"DETAILS": [
        {
            "PERIOD": 201801,
            "DETAILS": [
                { 
                    "ID": 12345,
                    "DETAILS": [
                       "MANAGER": "Dave",
                       "MANAGER": "Jill"
                    ]
                },
                { 
                    "ID": 12346,
                    "DETAILS": [
                        "MANAGER": "Dave"
                    ]
                },
                { 
                    "ID": 12347,
                    "DETAILS": [
                        "MANAGER": "Jon"
                    ] 
                }
        },
        {
            "PERIOD": 201802,
            "DETAILS": [
                { 
                    "ID": 12345,
                    "DETAILS": [
                        "MANAGER": "Rob"
                    ] 
                },
                { 
                    "ID": 12347,
                    "DETAILS": [
                        "MANAGER": "Dave"
                    ]
                }
        },
        {
            "PERIOD": 201803,
            "DETAILS": [
                { 
                    "ID": 12345,
                    "DETAILS": [
                        "MANAGER": "Bailey"
                    ]
                }
        }
    ] 
}

Возможный дубликат Как преобразовать хэш-карту в объект JSON в Java

Aleks G 10.12.2018 15:22

Я проголосовал за закрытие этого вопроса как дубликата stackoverflow.com/questions/12155800/… - в частности, проверьте этот ответ - stackoverflow.com/a/12156646/717214

Aleks G 10.12.2018 15:22

Это не дубликат тех других вопросов. Они конкретно спрашивают, как преобразовать HashMap в JSON. Это было бы неплохо, но неприменимо, поскольку мне нужно оценить значения в HashMap и превратить эти ключи в сам объект JSON.

tyejae 10.12.2018 15:39

Вы можете привести пример, иллюстрирующий key/value pair in the HashMap can be any number of items?

A4L 10.12.2018 15:41

@ A4L Я сделал правку, чтобы проиллюстрировать добавление еще одного уровня к паре ключ / значение.

tyejae 10.12.2018 15:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
2 003
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Решил эту проблему:

private void insertValueIntoDetails(String key, String value, JsonArray details,  int targetIndex, int currentIndex) {
    // if the targetIndex equals the currentIndex ?
    if (targetIndex == currentIndex) {
        // if details doesn't have the value, then insert it
        AtomicBoolean hasValue = new AtomicBoolean(false);
        details.forEach(item -> {
            if (((JsonObject)item).get("ID").getAsString().equals(value.toString())) {
                hasValue.set(true);
            }
        });
        if (!hasValue.get()) {
            JsonObject o = new JsonObject();
            o.addProperty("ID", value);
            o.add("Details", new JsonArray());
            details.add(o);
        }
    }
    // if the targetIndex > currentIndex
    if (targetIndex > currentIndex) {
        // call insertValueIntoDetails with key, value, details of the currentIndex, targetIndex, currentIndex + 1
        JsonArray deets = getDetails(key, details, currentIndex);
        insertValueIntoDetails(key, value, deets, targetIndex, currentIndex + 1);
    }
}

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