web-dev-qa-db-ja.com

yamlファイルを解析する

yamlファイルを扱うのはこれが初めてなので、最初に考えたのは、ファイルの解析に役立つライブラリを見つけることでした。

2つのライブラリYamlBeanSnakeYamlを見つけました。どちらを使用するのかわかりません。

ここに私が解析しようとしているファイルの例があります

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

ファイルは動的に変更されるため、ファイルに含まれるユーザーまたはグループの数はわかりません。

これから取得したい情報は、ユーザー名とこのようなグループです

user1 Premium
user2 Mod
user3 default

このグループのグループ名のみ

Mod
default
Admin

誰でもここから始められますか?そして、これに使用するのに最適なライブラリは何ですか? YamlBeanまたはSnakeYaml。

簡単に反復できるものに情報を保存する必要があると思います。

48

最終的にSnakeYamlを使用し、いくつかの分割文字列を作成して問題を解決しました。

YamlファイルをObjectにロードしてからMapにロードし、次にMapからの結果をString[]に分割してからforループに読み込んだString[]からの名前。グループでも同じことをしました。

より良い解決策があることは知っていますが、このプロジェクトにはこれで十分です。

返信いただきありがとうございます。

15

Jacksons YAML module を使用することもできます。

それを使用するには、いくつかのクラスが必要です。ファイルのコンテンツを運ぶモデルクラスと、YAMLファイルの読み取りを処理するクラス。

ルートモデルクラスは次のようになります。

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

    // getter methods ommitted
}

User(*)クラス:

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

    // getter methods ommitted
}

GroupTypeは、考えられるすべてのグループタイプを含む列挙型にすることができます。

public enum GroupType {
    Premium, Mod, Default
}

Enumエントリでは大文字と小文字が区別されることを忘れないでください。そのため、「プレミアム」は機能しません。すべてのモデルクラスをそのように構築できます。すべてのサブエントリは、独自のモデルクラスを取得する必要があります。

次に、YAMLファイルを読み取ることができる部分に進みます。

public MyYamlFile readYaml(final File file) {
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
    return mapper.readValue(file, MyYamlFile.class);
}

あなたが見ることができるように、あなたが多くを必要としないので、この部分は本当にすてきです。ファイルインスタンスにはYAMLファイルが含まれています。次のようなものを作成できます。

File file = new File("path/to/my/yaml/usersAndGroups.yaml");

Fileの代わりに、readValueメソッドは、InputStreamJava.io.ReaderString(コンテンツ全体)、Java.net.URL、およびバイト配列もサポートします。あなたに合ったものを見つける必要があります。

(*)Jacksonでダイナミックキーを使用することはできないと思うので、YAMLファイルの構造を変更することを検討する必要があります(誰かがそれについて詳しく知っているかもしれません)。

users: 
    - name: user1
      groups:
        - Premium
    - name: user2
      groups:
        - Mod
    - name: user3
      groups:
        - Default
groups:
    ....
50
Tom

YamlBeanは、DMelt Java数値計算環境に含まれています( http://jwork.org/dmelt/ )。キー値マップを作成し、yamlファイルとして保存するjhplot.io.HFileYAMLクラスを使用してYamlファイルを作成できます。

0
Tina21