Parsowanie YAML bez znajomości struktury pliku

0

W jaki sposób wyodrębnić wszystkie elementy z pliku YAML ?
Używając biblioteki Jacksons YAML jestem w stanie wyświetlić zawartość pliku, np.:

Mój plik YAML:

users:
  user1:
    groups:
    - Premium
  user2:
    groups:
    - Mod
  user3:
    groups:
    - default
groups:
  Mod:
    permissions:
      test: true
    inheritance:
    - Premium
  default:
    permissions:
      test.test: true
    inheritance:
    - Mod
  Admin:
    permissions:
      test.test.test: true
    inheritance:
    - Mod

Kod :

File file = new File("yaml1.yaml");
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Object obj = mapper.readValue(file, Object.class);
Map<?, ?> map = (Map<?, ?>) obj;

for(Entry<?, ?> entry : map.entrySet())
    System.out.println(entry.getKey() + " -> " + entry.getValue());
```

Wynik:

```
users -> {user1={groups=[Premium]}, user2={groups=[Mod]}, user3={groups=[default]}}
groups -> {Mod={permissions={test=true}, inheritance=[Premium]}, default={permissions={test.test=true}, inheritance=[Mod]}, Admin={permissions={test.test.test=true}, inheritance=[Mod]}}
```

Chciałbym wyświetlić zawartość pliku w bardziej przyjaznej formie - np.:

```
users
user1 -> groups -> Premium
user2 -> groups -> Mod
user3 -> groups -> default

groups
Mod -> permissions -> test -> true
inheritance -> Premium
default -> permissions -> test.test -> true
inheritance -> Mod
Admin -> permissions -> test.test.test -> true
inheritance -> Mod
```

W jaki sposób mogę się dostać do tych zagnieżdżonych elementów ?
Wiem, że metoda ****readValue**** zwraca kolekcję map i list.
Mogę odczytać te elementy używając wielu zagnieżdżonych pętli ale w przypadku gdy nie wiem jak wygląda wnętrze pliku - nie jestem w stanie znaleźć uniwersalnego rozwiązania.
2

Mogę odczytać te elementy używając wielu zagnieżdżonych pętli ale w przypadku gdy nie wiem jak wygląda wnętrze pliku - nie jestem w stanie znaleźć uniwersalnego rozwiązania.

Poczytaj o rekurencji :-)

0
Patryk27 napisał(a):

Mogę odczytać te elementy używając wielu zagnieżdżonych pętli ale w przypadku gdy nie wiem jak wygląda wnętrze pliku - nie jestem w stanie znaleźć uniwersalnego rozwiązania.

Poczytaj o rekurencji :-)

Udało się właśnie za pomocą rekurencji.
Wykrywam typ obiektu za pomocą metod getClass() i SimpleName().
Jeżeli jest to lista lub mapa, wówczas wywołuje rekurencję.
W przeciwnym wypadku - wyświetlam odpowiedni typ.
Dziękuje i w takim razie temat jest do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1