2014-09-11 47 views
30

Bu, ilk defa yaml dosyaları ile çalışıyorum, bu yüzden baktığımda ilk düşünmek, dosyayı ayrıştırmama yardımcı olabilecek herhangi bir kitaplık bulmaktı.Bir yaml dosyasını ayrıştırma

İki kitaplık buluyorum YamlBean ve SnakeYaml Kullanacağım hangisi olduğundan emin değilim. İşte

Ben

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 

dosya dinamik değişecek yüzden dosya içerecektir kaç kullanıcı veya grupların bilmiyorum ayrıştırmak çalışıyorum dosyanın bir örnektir.

ben bundan getirmek istediğiniz bilgiler bu

Mod 
default 
Admin 

Herkes alabilir gibi, kullanıcı adı ve tek grup adları bu

user1 Premium 
user2 Mod 
user3 default 

gibi ve gruplardan grup ben burada başladım ve bunun için kullanılacak en iyi kütüphane nedir? YamlBean veya SnakeYaml.

Bilgiyi, kolayca yineleyebileceğim bir şeye kaydetmem gerek.

cevap

7

I SnakeYaml kullanarak sona erdi ve benim sorunu çözmek için bazı split dizeleri yaptı.

String[] içine Map sonucunu bölmek ve daha sonra bir for döngü içinde ben String[] adını okudu, sonra Object ve daha sonra bir Map içine yaml dosyasını Yüklendi. Aynı şeyi gruplar halinde yaptım.

Orada daha iyi çözümler olduğunu biliyorum, ancak bu proje için yeterince iyi. tüm yanıtlar için

teşekkürler.

37

Jacksons YAML module'u da kullanabilirsiniz.

Bunu kullanabilmek için birkaç sınıfa ihtiyacınız olacak. Dosyanızın içeriğini ve YAML dosyasını okumaya özen gösteren bir sınıfı taşıyan model sınıfları.

kök modeli sınıfı bu gibi görünebilir:

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

    // getter methods ommitted 
} 

Kullanıcı (*) sınıfı:

public enum GroupType { 
    Premium, Mod, Default 
} 
: groupType tüm olası grup türlerini içeren bir Enum olabilir

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

    // getter methods ommitted 
} 

Enum girişlerinin büyük/küçük harfe duyarlı olduğunu unutmayın. Yani "prim" işe yaramaz. Tüm model sınıflarınızı bu şekilde oluşturabilirsiniz. Her alt giriş kendi model sınıfına sahip olmalıdır.

Şimdi o YAML dosyasını okuyabilir kısmına:

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

Gördüğünüz gibi çok daha gerekmediğinden, bu bölüm, gerçekten temiz. Dosya örneği YAML dosyanızı içerir. Böyle bir hesap oluşturabilirsiniz:

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

yerine File ait readValue yöntem ayrıca (tüm içeriği) InputStream, java.io.Reader, String destekler

, java.net.URL ve bayt dizisi. Size uygun bir şey bulmalısınız.

(*) Ben Jackson ile dinamik anahtarları kullanmak mümkündür sanmıyorum, çünkü senin YAML dosyasının yapısını değiştirmeyi düşünmelisiniz (belki birisi bu konuda daha fazla bilir):

users: 
    - name: user1 
     groups: 
     - Premium 
    - name: user2 
     groups: 
     - Mod 
    - name: user3 
     groups: 
     - Default 
groups: 
    .... 
+3

Jacksons YAML modülünü bildiğiniz için teşekkür ederiz. bir sorun, başka bir uygulamada oluşturulan yaml dosyasını değiştirme olasılığım yok ve ben sadece okuyacağım. Belki bu modülü kullanmak mümkün mü? –

+0

@KristofferIsaksson Evet bunu deneyebilirsiniz. Bu sorunun cevabını okuyun: http://stackoverflow.com/questions/17685508/jackson-de-serialiazation-with-unknow-dynamic-property örnek olarak. Tüm dosyayı "Liste >" olarak alan başka bir sınıfa ihtiyacınız olacaktır. "user1" bu haritadaki bir anahtar "yer" olurdu. – Tom

0

YamlBean DMelt Java sayısal bilgisayar ortamında (http://jwork.org/dmelt/) dahildir. Anahtar-değer haritası oluşturan ve yaml dosyası olarak kaydedilen jhplot.io.HFileYAML sınıfını kullanarak Yaml dosyaları oluşturabilirsiniz.