Получение ключей из нескольких объектов JSON

#java #json #spring-boot

#java #json #весенняя загрузка

Вопрос:

У меня есть объект JSON, который содержит неопределенный шаблон, и мне нужно получить все ключи объекта json и подобъектов.

Вот пример файла JSON:

 {
  "users": {
    "address": [
      {
        "rue": "ruetest",
        "postal": 1111
      },
      {
        "rue": "ruetest",
        "postal": 2222
      }
    ],
    "type": "string",
    "user": [
      {
        "argent": 122,
        "id": 1,
        "nom": "user1",
        "prenom": "last1"
      },
      {
        "argent": 200,
        "id": 2,
        "nom": "user2",
        "prenom": "last2"
      },
      {
        "argent": 1205,
        "id": 3,
        "nom": "user3",
        "prenom": "last3"
      }
    ]
  }
}
 

и мне нужно иметь такой вывод:

[users,type,address,user,argent,id,nom,prenom] или что-то вроде этого

Ответ №1:

Я не думаю, что на самом деле существует встроенный способ сделать это, но вы могли бы достичь своей цели, создав функцию, которая это делает. Что-то вроде (в псевдокоде):

 public Set getJsonKeys(JSON json) {
  Set s = new Set();
  for (Entry e : json.entrySet()) {
    s.add(e.key);
    if (e.value instanceof JSON) s.addAll(getJsonKeys(e.value));
  }
  return s;
}
 

Я выбрал набор, а не список, чтобы предотвратить дублирование записей. Если вы хотите включить ключи списков, просто добавьте проверку, если e.value это список, и если да, выполните итерацию по элементам и добавьте getJsonKeys(element) для всех элементов.

Комментарии:

1. спасибо, что ответили, я уже делал что-то подобное, но я надеялся найти встроенную функцию. Мне все еще нужно продвинуться дальше и получить что-то вроде этого [users,users.type,users.address,users.user,users.user.argent,users.user.id,users.user.nom,users.user.prenom ] или что-то подобное, чтобы иметь возможность получить доступ к любое значение, к которому я хочу получить доступ

Ответ №2:

Вы пробовали режим Genson Java Collections? Это дало бы вам простой общий доступ к произвольным JSON-файлам в java.

Комментарии:

1. я не могу использовать его, потому что мой объект json не имеет универсального типа, поэтому я не могу предопределить класс Java для его сериализации

Ответ №3:

Если вы используете фреймворк fastjson, я думаю, вы можете использовать следующий код, чтобы получить все ключи:

 JSONObject jsonObject = new JSONObject(jsonData);
Iterator keys = jsonObject.keys();
while (keys.hasNext()){
        String key = String.valueOf(keys.next());
    }
 

Комментарии:

1. Выполняет keys() ли рекурсию во все подобъекты или дает вам только ключи верхнего уровня?

2. Это даст вам все ключи