Как читать карту списков из файла Yaml, используя Java - PullRequest
0 голосов
/ 16 мая 2018

У меня есть такой файл Yaml:

accept: 
- "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
accept-encoding: 
- "gzip, deflate"
accept-language: 
- "en-GB,en-US;q=0.9,en;q=0.8"
- "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,lt;q=0.6"
connection: 
- close
- keep-alive
dnt: 
- 1
referer: 
- "https://www.google.com/"
- "https://www.yahoo.com"
- "https://www.bing.com/"
upgrade-insecure-requests: 
- 1
- 0
x-real-ip: ~

И я пытаюсь прочитать это с:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
Map user = mapper.readValue(new File("/home/a/headers.yaml"), Map.class);
System.out.println(ReflectionToStringBuilder.toString(user, ToStringStyle.MULTI_LINE_STYLE));

, но могу получить только один уровень вложенности.это я считаю должна быть карта списков ...

1 Ответ

0 голосов
/ 16 мая 2018

Когда я запускаю ваш код, он выводит:

java.util.LinkedHashMap@6500df86[
  accessOrder=false
  threshold=12
  loadFactor=0.75 
]

Что представляет собой строковое представление объекта Map, а не того, что внутри.

Трудный путь:

Если вы хотите использовать ReflectionToStringBuilder, боюсь, вам придется реализовать свой собственный стиль, расширив ToStringStyle.И ваш стиль должен был бы пройти по карте и извлечь ключи и значения.

Простой способ:

Однако вы можете достичь в значительной степени того, что вы хотите спростые циклы, и это намного проще, вот пример:

Map<String, List <Object>> user = 
    mapper.readValue(new File("/home/a/headers.yaml"), Map.class);

for(Map.Entry<String, List<Object>> entry : user.entrySet()) {
    System.out.println(entry.getKey());
    List<Object> values = entry.getValue();
    if(values != null) {
        for (Object value : values) {
            System.out.println("  - " + String.valueOf(value));
        }
    }
}

Учитывая ваш файл, он выводит:

accept
  - text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
accept-encoding
  - gzip, deflate
accept-language
  - en-GB,en-US;q=0.9,en;q=0.8
  - ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,lt;q=0.6
connection
  - close
  - keep-alive
dnt
  - 1
referer
  - https://www.google.com/
  - https://www.yahoo.com
  - https://www.bing.com/
upgrade-insecure-requests
  - 1
  - 0
x-real-ip
...