2016-02-05 19 views
7

Jestem nowy YAML i mają przeanalizować plik konfiguracyjny YAML, który wygląda tak:Jak przetwarzać część pliku YAML w SnakeYaml

applications: 
    authentication: 
    service-version: 2.0 
    service-url: https://myapp.corp/auth 
    app-env: DEV 
    timeout-in-ms: 5000 
    enable-log: true 

    service1: 
    enable-log: true 
    auth-required: true 
    app-env: DEV 
    timeout-in-ms: 5000 
    service-url: https://myapp.corp/service1 
    service-name: SomeService1 
    service-version: 1.1 
    service-namespace: http://myapp.corp/ns/service1 

    service2: 
    enable-log: true 
    auth-required: true 
    app-env: DEV 
    timeout-in-ms: 5000 
    service-url: https://myapp.corp/service2 
    service-name: SomeService2 
    service-version: 2.0 
    service-namespace: http://myapp.corp/ns/service2 

muszę analizować do następujących Map strukturę

+==================================+ 
| Key    |    | 
+==================================+ 
| authentication | AuthConfig | 
+----------------------------------+ 
| service1   | ServiceConfig | 
+----------------------------------+ 
| service2   | ServiceConfig | 
+----------------------------------+ 

AuthConfig i ServiceConfig są niestandardowymi obiektami w naszym systemie.

Czy ktoś może podać wskazówki, jak to zrobić?

+0

Możliwe jest nie jest to poprawna odpowiedź, ale możesz użyć YamlBeans zamiast: http://yamlbeans.sourceforge.net/ która wydaje się być lepiej udokumentowana –

+0

Ten projekt został przeniesiony na GitHub i tam mają bardzo mało dokumentacji. W rzeczywistości dokumentacja jest gorsza niż SnakeYaml. Może czegoś tu brakuje, ale czy masz linki do dokumentacji YamlBeans? – Niranjan

+0

Tak, został przeniesiony: https://github.com/EsotericSoftware/yamlbeans W Github README jest wyjaśnienie, co chcesz zrobić. –

Odpowiedz

3

Istnieje pakiet dla języka Java o nazwie Jackson, który obsługuje mapowanie między obiektami YAML (oraz JSON, CSV i XML) i Java. Większość przykładów, które napotkasz, dotyczy JSON, ale link YAML pokazuje, że przełączanie jest proste. Wszystko przechodzi przez ObjectMapper:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); 

To może być następnie wykorzystane do deserializowania swój przedmiot za pośrednictwem refleksji:

ApplicationCatalog catalog = mapper.readValue(yamlSource, ApplicationCatalog.class); 

by skonfigurować klas coś takiego (Zrobiłem wszystko publicznego w celu ułatwienia z przykładu):

class ApplicationCatalog { 
    public AuthConfig authentication; 
    public ServiceConfig service1; 
    public ServiceConfig service2; 
} 

class AuthConfig { 
    @JsonProperty("service-version") 
    public String serviceVersion; 
    @JsonProperty("service-url") 
    public String serviceUrl; 
    @JsonProperty("app-env") 
    public String appEnv; 
    @JsonProperty("timeout-in-ms") 
    public int timeoutInMs; 
    @JsonProperty("enable-log") 
    public boolean enableLog; 
} 

class ServiceConfig { 
    ... 
} 

zauważy JsonProperty annotation który Zmiana nazwy pola Java dziedzinie YAML. Uważam to za najwygodniejszy sposób radzenia sobie z JSON i YAML w Javie. Musiałem również użyć streaming API dla naprawdę dużych obiektów.

+2

BTW, Jackson faktycznie używa SnakeYAML pod maską dla YAML. –

+0

Dzięki za odpowiedź; Znam interfejsy API Jacksona. Używamy tego dla naszych usług REST. Jestem również świadomy pakietu jackson-yml. Ale nie chciałem używać innego opakowania nad biblioteką snakeyml. Będę pisać, gdy znajdę przekonujące rozwiązanie. W każdym razie, doceń swoją pomoc. – Niranjan

-2

Ponieważ masz te same właściwości w konfiguracji Auth i Service, uprościliśmy to w jednej klasie, aby pokazać ci tutaj.

Klasa wygląd YamlConfig tak:

public class YamlConfig { 

    private Map<String, ServiceConfig> applications; 

    //... getter and setters here 
} 

A logika parser jest coś takiego:

Yaml yaml = new Yaml(new Constructor(YamlConfig.class)); 
InputStream input = new FileInputStream(new File("/tmp/apps.yml")); 
YamlConfig data = yaml.loadAs(input, YamlConfig.class); 

podzieliłem cały kod w tym GIST: https://gist.github.com/marceldiass/f1d0e25671d7f47b24271f15c1066ea3

+0

To jest próbka dla zmodyfikowanego kodu, a nie pierwotnego żądania OP. Plik YAML w OP używa dash (-) jako separacji, podczas gdy twoja używa camelCase. –