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 String
s:
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.