Распарсить сложный JSON-документ в HashSet

101
09 января 2021, 07:10

Имеется минимальный json-файлик с конфигами:

{
  "test": [
    {
      "micro": [
        {
          "attr": "1"
        }
      ]
    },
    {
      "macro": [
        {
          "attr2": "2"
        },
        {
          "attr3": "3"
        }
      ]
    }
  ]
}

Этот файл скорее всего будет расширяться, но структура не будет изменяться. Есть серия вложенных циклов:

for (Object key : json.keySet())
    {
        JSONArray themeArray = ((JSONArray) json.get(key.toString()));
        for (int i = 0; i < themeArray.length(); i++)
        {
            JSONObject langObject = (JSONObject) themeArray.get(i);
            for(Object key2 : langObject.keySet())
            {
                JSONArray langArray = (JSONArray) langObject.get(key2.toString());
                for(int j = 0; j < langArray.length(); j++)
                {
                    JSONObject tagObject = (JSONObject) langArray.get(j);
                    for(Object key3 : tagObject.keySet())
                    {
                        tags.add(tagObject.get(key3.toString()));
                    }
                }
            }
        }

Как по-вашему можно это сократить через рекурсию, чтобы на последнем шаге добавлялось в Set?

Answer 1

Как-то так

void parse(JSONObject json) {
  for (Object key : json.keySet()) {
    Object child = json.get(key.toString());
    if (child instanceof JSONArray) {
      JSONArray arr = (JSONArray) child;
      for (int i = 0; i < arr.length(); i++) {
        parse((JSONObject) arr.get(i));
      }
    } else {
      tags.add(child);
    }
  }
}

Если вы хотите, чтобы метод возвращал коллекцию, то проще всего будет написать метод-обертку. А сам метод parse сделать приватным

public Set<Object> publicParse(JSONObject json) {
  Set<Object> res = new HashSet<>;
  parse(res, json);
  return res;
}
READ ALSO
Как посмотреть тип переменной java?

Как посмотреть тип переменной java?

Я понимаю что в java "строгая типизация"Однако, если например я сделал множество приведений в коде и хочу вывести тип переменной в конце, как...

122
Про return более подробно?

Про return более подробно?

Начал изучать программирование и начал с языка Java и столкнулся с трудностью, поэтому прошу помощи

94
Не запускается проект GWT в Intellij Idea

Не запускается проект GWT в Intellij Idea

При запуске пишет ошибку:

125