Processar um ficheiro yaml

esta é a primeira vez que eu estou trabalhando com arquivos yaml, então o primeiro penso que eu olhei foi para encontrar qualquer biblioteca que poderia me ajudar a analisar o arquivo.

Tenho de encontrar duas bibliotecas YamlBean e SnakeYaml Não tenho a certeza de qual vou usar.

Aqui está um exemplo do arquivo que estou tentando analisar.
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

o ficheiro vai mudar dinamicamente, por isso não sei quantos utilizadores ou grupos o ficheiro iria conter.

A informação que gostaria de obter este é o nome do utilizador e o grupo como este

user1 Premium
user2 Mod
user3 default

e dos grupos apenas os nomes dos grupos, como este

Mod
default
Admin
Alguém pode fazer-me começar aqui? e qual é a melhor biblioteca para usar para isso? YamlBean ou SnakeYaml.

Acho que preciso de guardar a informação em algo que possa facilmente superar.

 41
Author: dev, 2014-09-12

3 answers

Também podes usarO módulo de Jacksons YAML .

Para usar isso, vais precisar de algumas aulas. As classes de modelos que carregarão o conteúdo de seu arquivo e a classe a que cuida de ler o arquivo YAML.

A classe do modelo raiz pode ser assim:

public class MyYamlFile {
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted
}

A classe do utilizador (*):

public class User {
    @JsonProperty
    private List<String> name;
    @JsonProperty
    private List<GroupType> groups;

    // getter methods ommitted
}

O GroupType pode ser um Enum contendo todos os tipos de grupo possíveis:

public enum GroupType {
    Premium, Mod, Default
}

Não te esqueças que as entradas são maiúsculas. sensivel. Então "premium" não vai funcionar. Podes construir todas as tuas aulas de modelos dessa maneira. Cada sub-entrada deve ter uma aula de modelos.

Agora para a parte em que você pode ler o arquivo YAML:
public MyYamlFile readYaml(final File file) {
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
    return mapper.readValue(file, MyYamlFile.class);
}
Como podem ver, esta parte é muito fixe, porque não precisam de muito. A instância do ficheiro contém o seu ficheiro YAML. Você pode criar um assim:
File file = new File("path/to/my/yaml/usersAndGroups.yaml");

Em vez de File, o método readValue também suporta InputStream, java.io.Reader, String (com todo o conteúdo), java.net.URL e byte matriz. Devias encontrar algo que te agrade.

(*) Você deve considerar mudar a estrutura do seu arquivo YAML, porque eu não acho que seja possível usar chaves dinâmicas com Jackson (talvez alguém saiba mais sobre isso):

users: 
    - name: user1
      groups:
        - Premium
    - name: user2
      groups:
        - Mod
    - name: user3
      groups:
        - Default
groups:
    ....
 47
Author: Tom, 2017-05-30 21:56:34
Acabei por usar o SnakeYaml e fiz algumas cordas para resolver o meu problema.

Carregou o ficheiro yaml para {[[0]} e depois para Map, depois dividiu o resultado do Map em String[] e depois num laço for li o nome do String[]. Fiz o mesmo com os grupos.

Sei que há melhores soluções por aí, mas isto é suficiente para este projecto. Obrigado a todos pelas respostas.
 13
Author: Kristoffer Isaksson, 2017-07-06 15:20:58

O YamlBean está incluído no DMelt Java numeric computational environment ( http://jwork.org/dmelt/). poderá criar ficheiros Yaml com a classe jhplot. io. HFileYAML, que cria um mapa do valor-chave e grava como ficheiro yaml.

 0
Author: Tina21, 2016-03-13 03:16:18