Muunna YAML-taulukko Java-luetteloksi SnakeYAML:n avulla

esittely

YAML on yksi suosituimmista tietojen serialointikielistä sen jälkeen JSON. Siksi sitä kutsutaan joskus nimellä a tiukka pääjoukko JSONista. Se on alusta alkaen suunniteltu ihmisten välistä vuorovaikutusta ja luettavuutta varten, joten se tunnetaan yksinkertaisuudestaan. Se on suunniteltu joustavuutta ja helppokäyttöisyyttä ajatellen, joten se toimii kaikkien nykyaikaisten ohjelmointikielten ja tehokkaan konfiguraatiotiedostojen kirjoittamismuodon kanssa. Sitä käytetään myös tietojen pysyvyyteen, Internet-viestintään, kieltenväliseen tiedon jakamiseen ja moniin muihin vaihtoehtoihin.

YAML aloitettiin vuonna 2001 ja sitä kutsuttiin nimellä "Vielä yksi kuvauskieli" siihen aikaan. Mutta myöhemmin se merkittiin tavaramerkiksi "YAML ei ole kuvauskieli". YAML-tiedoston perusrakenne on a kartta. Se tunnetaan myös sanakirjana, hash(kartta) tai yksinkertaisesti objektipohjaisena ohjelmointikielenä, jota valitsemme käyttää.

Välilyöntejä ja sisennystä käytetään YAML-tiedostoissa merkitsemään sisäkkäisyyttä.

Huomautuksia: YAML-tiedostoissa saa käyttää vain välilyöntejä sisennykseen; sarkainmerkit eivät ole sallittuja. Niin kauan kuin sisennys tehdään johdonmukaisesti, sillä ei ole väliä kuinka monta tilaa käytetään.

YAML-syntaksi

YAML-muodossa käytetään pääasiassa kolmea solmutyyppiä:

  • Kartat/sanakirjat: kartta solmun sisältö on järjestämätön kokoelma avain/arvo solmu paria, edellyttäen, että jokaisen avaimen on oltava erillinen. YAML ei aseta solmuille muita rajoituksia.
  • Taulukot/luettelot: An ryhmä solmun sisältö on järjestetty kokoelma nolla tai useampia solmuja. Sarja voi sisältää saman solmun useammin kuin kerran, erityisesti. Se voi sisältää jopa itsensä.
  • literals (merkkijonot, numerot, loogiset arvot jne.): Nollan tai useamman sarjan sarja Unicode-merkit voidaan käyttää edustamaan läpinäkymätöntä dataa, joka muodostaa a skalaari solmun sisältöä.

Tässä artikkelissa tarkastelemme erityisesti YAML-taulukon sisällön muuntamista Java-luetteloksi. Saatavilla on paljon avoimen lähdekoodin kirjastoja, mutta suosituimmat niistä ovat Jackson ja SnakeYAML. Tässä oppaassa käytämme SnakeYamlia kirjastona YAML-sisällön jäsentämiseen.

SnakeYaml

SnakeYAML on YAML-jäsennyspaketti, joka tarjoaa korkean tason API:n YAML-asiakirjojen serialisointiin ja deserialisointiin. SnakeYAML:n sisääntulopiste on Yaml luokkaa. Asiakirjat tai YAML-tiedostot voidaan ladata käyttämällä load() menetelmällä tai erässä kautta loadAll() menetelmä. Menetelmät ottavat aitoa YAML-dataa sekä String-objektien muodossa InputStreams, joka on tavallinen tiedostotyyppi.

Kun otetaan huomioon : YAML-tiedostoille luontainen rakenne, SnakeYAML toimii luonnollisesti hyvin Java kartat, mutta voimme käyttää myös ainutlaatuisia Java-objekteja.

Jos haluat sisällyttää kirjaston projektiimme, lisää seuraava riippuvuus omaan pom.xml tiedosto:

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

Tai jos käytät Gradlea:

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

Yksinkertaisen YAML-taulukon lukeminen

Aloitetaan nopeasti lukemalla yksinkertainen taulukko YAML-tiedostosta. Oletetaan, että meillä on Java-projektimme resurssikansiossa yaml-tiedosto, jossa on seuraavat tiedot:

- One
- Two
- Three
- Four

Sitten voimme ladata tiedoston sisällön an InputStream. Seuraavaksi rakennamme Yaml esiintymä, joka toimii sitten sisääntulopisteenä kirjastoon ja objektiin pääsyä varten, joka edustaa YAML-tiedoston sisältöä ohjelmallisesti. The load() menetelmän avulla voimme lukea ja jäsentää mitä tahansa InputStream kelvollisilla YAML-tiedoilla:

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

Menetelmä palauttaa Javan List merkkijonodatasta. Jos tulostamme data sitten se antaa seuraavan tuloksen:

[One, Two, Three, Four]

YAML-ryhmitellyn taulukon lukeminen

Joskus haluaisimme määrittää joukon sisältöä tiettyä avainta vastaan. Tätä kutsutaan taulukoiden ryhmittämiseksi YAML-karttasolmuksi. YAML-esimerkki tällaisesta näyttää seuraavalta:

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

Tätä voidaan pitää Javana Map joka sisältää : jossa arvo on an ryhmä. Joten tiedot ladataan edelleen muodossa InputStream kuten edellä määritimme. Mutta data on määriteltävä muodossa 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);
}

Jos nyt luemme meidän data, se näyttäisi suunnilleen tältä:

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

YAML-monirivisen taulukon lukeminen

Joskus törmäämme YAML-tiedostoon, jonka tiedot sisältävät taulukoita. Esimerkiksi ryhmittelemme kurssit ja esitämme ne taulukoiden joukkona, kuten alla:

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

Tämä voidaan jäsentää Javana Map of List of List of String. Voimme ladata uudelleen InputStream kuten teimme aiemmin. Mutta tiedot ladataan seuraavasti:

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!

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);
}

Joten jos tulostamme data, se näyttäisi tältä alla:

{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

Monimutkaisen sisäkkäisen YAML-sisällön lukeminen Java-pavuna

Näimme, kuinka voimme käsitellä taulukkotyyppistä sisältöä erikseen, mutta monimutkaisilla sisäkkäisillä YAML-tiedostoilla – luetteloluetteloiden sisältävän karttakartan luominen on vaikeaa jäsentää intuitiivisesti ja vaikea käsitellä. Jopa viimeisessä esimerkissä, jossa meillä oli vain kaksi sisäkkäistä luetteloa – niiden käsittely luetteloina on melko monisanaista.

Näissä tapauksissa on parasta luoda POJO, joka voidaan yhdistää sisäkkäisiin YAML-tietoihin. Luodaan ensin esimerkki-YAML, joka sisältää verkkosivuston sisäkkäisen sisällön:

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

Meidän on määritettävä Java-yläluokka WebsiteContent joka koostuu List taidoista ja a List of Map opetusohjelmista, jotka sisältävät jälleen luetteloita tunnisteista ja avustajista:

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 + ''' +
                '}';
    }
}

Nyt voimme jälleen ladata tiedot tiedostosta nimellä InputStream kuten teimme aiemmin. Seuraavaksi kun luomme omamme Yaml luokan objektiin, meidän on määritettävä tietotyyppi, johon haluamme lähettää tiedot. The new Constructor(WebsiteContent.class) käskee SnakeYAML:a lukemaan tiedot YAML-tiedostosta yhdistämään ne meidän WebsiteContent esine.

Kartoitus on yksinkertaista ja objektiattribuuttien nimien on vastattava YAML-attribuuttien nimiä.

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);
}

Lopuksi, kun tulostamme data, se näyttäisi tältä alla:

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}}

Kuten näemme, SnakeYaml on onnistuneesti jäsentänyt ja muuntanut WebsiteContent vastustaa ja säilyttää perinnön ja yhteyden Tutorial esine ehjänä.

Yhteenveto

Koska YAML-tiedostoja käytetään laajalti DevOpsiin ja konfigurointiin liittyviin tietoihin, on varsin hyödyllistä jäsentää ja käsitellä tietoja koodin avulla.

SnakeYAML antaa meille mahdollisuuden hallita Java-projektissamme olevia YAML-tiedostoja helposti, ja se vaatii vain vähän koodia YAML-tiedostojen lataamiseen projektiimme tai tietojen kirjoittamiseen YAML-tiedostoihin. Lisäksi SnakeYAML tarjoaa muotoiluvaihtoehtoja, jotta voit muokata ja mukauttaa sitä tarpeidemme mukaan.

Aikaleima:

Lisää aiheesta Stackabus