Pretvorite niz YAML v seznam Java s SnakeYAML

Predstavitev

YAML je eden najbolj priljubljenih jezikov za serializacijo podatkov po JSON. Zato se včasih imenuje kot a strogo superset JSON. Že od samega začetka je bil zasnovan za človeško interakcijo in berljivost, zato je znan po svoji preprostosti. Zasnovan je z mislijo na prilagodljivost in dostopnost, zato deluje z vsemi sodobnimi programskimi jeziki in zmogljivim formatom za pisanje konfiguracijskih datotek. Uporablja se tudi za obstojnost podatkov, internetno sporočanje, izmenjavo podatkov med jeziki in številne druge možnosti.

YAML je bil ustanovljen leta 2001 in je bil imenovan kot "Še en označevalni jezik« takrat. Kasneje pa je bil zaščiten kot "YAML ni označevalni jezik“. Osnovna struktura datoteke YAML je a map. Znan je tudi kot slovar, hash (map) ali preprosto objektno zasnovan glede na programski jezik, za katerega se odločimo.

Presledki in zamiki se v datotekah YAML uporabljajo za označevanje gnezdenja.

Opombe: Za zamik v datotekah YAML se lahko uporabljajo samo presledki; tabulatorji niso dovoljeni. Dokler se zamik izvaja dosledno, ni pomembno, koliko presledkov je uporabljenih.

Sintaksa YAML

Format YAML uporablja predvsem 3 vrste vozlišč:

  • Zemljevidi/Slovarji: map vsebina vozlišča je neurejena zbirka ključ/vrednost Vozel parov, z zahtevo, da mora biti vsak ključ ločen. YAML vozliščem ne nalaga nobenih dodatnih omejitev.
  • Nizi/seznami: An matrika vsebina vozlišča je urejena zbirka nič ali več vozlišč. Zaporedje lahko zlasti več kot enkrat vključuje isto vozlišče. Lahko vsebuje celo samega sebe.
  • Literali (Nizovi, številke, logične vrednosti itd.): Zaporedje nič ali več Znaki Unicode se lahko uporablja za predstavitev neprozornih podatkov, ki sestavljajo a skalarno vsebino vozlišča.

V tem članku si bomo posebej ogledali pretvorbo vsebine polja YAML v seznam v Javi. Na voljo je veliko odprtokodnih knjižnic, vendar so najbolj priljubljene med njimi Jackson in SnakeYAML. V tem priročniku bomo uporabili SnakeYaml kot našo knjižnico za razčlenjevanje vsebine YAML.

SnakeYaml

SnakeYAML je paket za razčlenjevanje YAML, ki ponuja API na visoki ravni za serializacijo in deserializacijo dokumentov YAML. Vstopna točka za SnakeYAML je Yaml razred. Dokumente ali datoteke YAML lahko naložite z uporabo load() metodo ali paketno prek loadAll() metoda. Metode zajemajo tudi pristne podatke YAML v obliki objektov String InputStreams, ki je tipična vrsta datoteke.

Glede na : strukturo, ki je prirojena datotekam YAML, SnakeYAML seveda dobro deluje Java Maps, lahko pa uporabimo tudi unikat objekti Java.

Če želite vključiti knjižnico v naš projekt, dodajte naslednjo odvisnost svoji pom.xml datoteka:

<dependencies>
    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.33</version>
    </dependency>
</dependencies>

Ali če uporabljate Gradle:

compile group: 'org.yaml', name: 'snakeyaml', version: '1.33'

Branje preproste matrike YAML

Hitro začnimo z branjem preproste matrike iz datoteke YAML. Predpostavimo, da imamo datoteko yaml z naslednjimi podatki v mapi virov našega projekta Java:

- One
- Two
- Three
- Four

Nato lahko naložimo vsebino datoteke kot InputStream. Nato bomo zgradili Yaml primerek, ki bo nato deloval kot vstopna točka za dostop do knjižnice in objekta za programsko predstavitev vsebine datoteke YAML. The load() metoda nam omogoča branje in razčlenjevanje katerega koli InputStream z veljavnimi podatki YAML:

public void readYamlWithArray() {
    InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("number.yml");
    Yaml yaml = new Yaml();
    List data = yaml.load(inputStream);
    System.out.println(data);
 }

Metoda bo vrnila Javo List podatkov niza. Če natisnemo data potem bo dal naslednji rezultat:

[One, Two, Three, Four]

Branje združene matrike YAML

Včasih želimo definirati niz vsebine glede na dani ključ. To se imenuje združevanje nizov v vozlišče zemljevida YAML. Vzorec YAML takšne vrste je videti takole:

languages:
  - Java
  - JavaScript
  - Python
  - Golang
  - Perl
  - Shell
  - Scala

To lahko štejemo za Java Map ki vsebujejo a : kjer je vrednost an matrika. Torej bodo podatki še vedno naloženi kot InputStream kot smo definirali zgoraj. Toda data je treba opredeliti kot Map of List of Strings:

public void readYamlWithArrayGroup() {
    InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("language.yml");
    Yaml yaml = new Yaml();
    Map<String, List> data = yaml.load(inputStream);
    System.out.println(data);
    
    data.values()
            .stream()
            .collect(Collectors.toList())
            .get(0)
            .forEach(System.out::println);
}

Zdaj, če preberemo naše data, bi bilo videti nekako takole:

{languages=[Java, JavaScript, Python, Golang, Perl, Shell, Scala]}
Java
JavaScript
Python
Golang
Perl
Shell
Scala

Branje večvrstične matrike YAML

Včasih naletimo na datoteko YAML s podatki, ki vsebujejo niz nizov. Na primer, združimo tečaje in jih predstavimo kot niz nizov, kot je prikazano spodaj:

courses:
  - - C
    - Java
    - Data Structures
    - Algorithms
  - - Big Data
    - Spark
    - Kafka
    - Machine Learning

To je mogoče razčleniti kot Java Map of List of List of String. Ponovno lahko naložimo InputStream kot smo storili prej. Podatki pa bodo naloženi kot spodaj:

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

public void readYamlWithMultiLineArrayGroup() {
    InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("courses.yml");
    Yaml yaml = new Yaml();
    
    Map<String, List<List>> data = yaml.load(inputStream);
    System.out.println(data);
    
    System.out.println("First Array Group:");
    data.values()
            .stream()
            .collect(Collectors.toList())
            .get(0)
            .get(0)
            .forEach(System.out::println);
    
    System.out.println("nSecond Array Group:");
    data.values()
            .stream()
            .collect(Collectors.toList())
            .get(0)
            .get(1)
            .forEach(System.out::println);
}

Torej, če natisnemo data, bi izgledalo nekako takole spodaj:

{courses=[[C, Java, Data Structures, Algorithms], [Big Data, Spark, Kafka, Machine Learning]]}

First Array Group:
C
Java
Data Structures
Algorithms

Second Array Group:
Big Data
Spark
Kafka
Machine Learning

Branje kompleksne ugnezdene vsebine YAML kot Java Bean

Videli smo, kako lahko ločeno obravnavamo vsebino matričnega tipa, vendar s kompleksnimi ugnezdenimi datotekami YAML – imeti zemljevid zemljevidov s seznami seznamov je težko intuitivno razčleniti in težko se spoprijeti s tem. Tudi v zadnjem primeru, ko smo imeli samo dva ugnezdena seznama – ravnanje z njimi kot s seznami postane dokaj podrobno.

V teh primerih je najbolje ustvariti POJO, ki ga je mogoče preslikati v ugnezdene podatke YAML. Najprej ustvarimo vzorec YAML, ki vsebuje ugnezdeno vsebino spletnega mesta:

website: stackabuse
skills:
  - python
  - javascript
  - java
  - unix
  - machine learning
  - web development
tutorials:
  - graphs:
      name: Graphs in Python - Theory and Implementation
      tags:
        - python
        - data structures
        - algorithm
      contributors:
        - David Landup
        - Dimitrije Stamenic
        - Jovana Ninkovic
      last_updated: June 2022
  - git:
      name: Git Essentials - Developer's Guide to Git
      tags:
        - git
      contributors:
        - David Landup
        - François Dupire
        - Jovana Ninkovic
      last_updated: April 2022
  - deep learning:
      name: Practical Deep Learning for Computer Vision with Python
      tags:
        - python
        - machine learning
        - tensorflow
        - computer vision
      contributors:
        - David Landup
        - Jovana Ninkovic
      last_updated: October 2022
published: true

Določiti moramo nadrejeni razred Java WebsiteContent ki bo sestavljen iz List spretnosti in a List of Map vadnic, ki bodo spet vsebovale sezname oznak in sodelavcev:

public class WebsiteContent {
    private String website;
    private List skills;
    private List<Map> tutorials;
    private Boolean published;

    

    @Override
    public String toString() {
        return "WebsiteContent{" +
                "website='" + website + ''' +
                ", skills=" + skills +
                ", tutorials=" + tutorials +
                ", published=" + published +
                '}';
    }
}
public class Tutorial {

    private String name;
    private List tags;
    private List contributors;
    private String lastUpdated;

    

    @Override
    public String toString() {
        return "Tutorial{" +
                "name='" + name + ''' +
                ", tags=" + tags +
                ", contributors=" + contributors +
                ", lastUpdated='" + lastUpdated + ''' +
                '}';
    }
}

Zdaj lahko spet naložimo podatke iz datoteke kot InputStream kot smo storili prej. Naslednji, ko ustvarimo našo Yaml class object, moramo določiti podatkovni tip, v katerega želimo prenesti podatke. The new Constructor(WebsiteContent.class) pove SnakeYAML, naj prebere podatke iz datoteke YAML, ki jo preslika v našo WebsiteContent predmet.

Preslikava je preprosta in imena naših atributov objektov se morajo ujemati z imeni atributov YAML.

public void readYamlAsBeanWithNestedArrays(){
    
    InputStream inputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("website_content.yml");
            
    
    Yaml yaml = new Yaml(new Constructor(WebsiteContent.class));
    WebsiteContent data = yaml.load(inputStream);
    
    
    System.out.println(data);
    System.out.println("nList of Skills: ");
    data.getSkills().stream().forEach(System.out::println);
    System.out.println("nList of Tutorials: ");
    data.getTutorials().stream().forEach(System.out::println);
}

Končno, ko natisnemo data, bi izgledalo nekako takole spodaj:

WebsiteContent{website='stackabuse', skills=[python, javascript, java, unix, machine learning, web development], tutorials=[{graphs={name=Graphs in Python - Theory and Implementation, tags=[python, data structures, algorithm], contributors=[David Landup, Dimitrije Stamenic, Jovana Ninkovic], last_updated=June 2022}}, {git={name=Git Essentials - Developer's Guide to Git, tags=[git], contributors=[David Landup, François Dupire, Jovana Ninkovic], last_updated=April 2022}}, {deep learning={name=Practical Deep Learning for Computer Vision with Python, tags=[python, machine learning, tensorflow, computer vision], contributors=[David Landup, Jovana Ninkovic], last_updated=October 2022}}], published=true}

List of Skills: 
python
javascript
java
unix
machine learning
web development

List of Tutorials: 
{graphs={name=Graphs in Python - Theory and Implementation, tags=[python, data structures, algorithm], contributors=[David Landup, Dimitrije Stamenic, Jovana Ninkovic], last_updated=June 2022}}
{git={name=Git Essentials - Developer's Guide to Git, tags=[git], contributors=[David Landup, François Dupire, Jovana Ninkovic], last_updated=April 2022}}
{deep learning={name=Practical Deep Learning for Computer Vision with Python, tags=[python, machine learning, tensorflow, computer vision], contributors=[David Landup, Jovana Ninkovic], last_updated=October 2022}}

Kot lahko vidimo, je SnakeYaml uspešno razčlenil in pretvoril WebsiteContent objekt ter obdržal dediščino in družbo z Tutorial objekt nedotaknjen.

zaključek

Ker se datoteke YAML široko uporabljajo za podatke, povezane z DevOps in konfiguracijo, je zelo koristno razčleniti in manipulirati podatke s kodo.

SnakeYAML nam omogoča enostavno upravljanje datotek YAML v našem projektu Java in zahteva le malo kode za nalaganje datotek YAML v naš projekt ali zapisovanje podatkov v datoteke YAML. Poleg tega SnakeYAML ponuja možnosti oblikovanja, tako da ga lahko prilagodite in prilagodite našim potrebam.

Časovni žig:

Več od Stackabuse