Introduzione
Yamla è uno dei linguaggi di serializzazione dei dati più popolari dopo JSON. Pertanto, a volte è chiamato come a rigoroso superinsieme di JSON. È stato progettato per l'interazione umana e la leggibilità sin dall'inizio, quindi è noto per la sua semplicità. È progettato pensando alla flessibilità e all'accessibilità, quindi funziona con tutti i moderni linguaggi di programmazione e un formato potente per la scrittura di file di configurazione. Viene anche utilizzato per la persistenza dei dati, la messaggistica Internet, la condivisione dei dati in più lingue e molte altre opzioni.
YAML è stato avviato nel 2001 ed è stato definito come "Ancora un altro linguaggio di markup" a quel tempo. Ma in seguito è stato registrato come "YAML non è un linguaggio di markup“. La struttura di base di un file YAML è a carta geografica. È anche noto come dizionario, hash(map) o semplicemente basato su oggetti sul linguaggio di programmazione che scegliamo di utilizzare.
Gli spazi bianchi e il rientro vengono utilizzati nei file YAML per denotare l'annidamento.
Note:: Solo gli spazi possono essere usati per il rientro nei file YAML; i caratteri di tabulazione non sono consentiti. Finché l'indentazione viene eseguita in modo coerente, non importa quanti spazi vengono utilizzati.
Sintassi YAML
Un formato YAML utilizza principalmente 3 tipi di nodi:
- Mappe/Dizionari: Un carta geografica il contenuto di node è una raccolta non ordinata di chiave/valore nodo coppie, con il requisito che ogni chiave deve essere distinta. YAML non impone ulteriori limitazioni ai nodi.
- Matrici/Elenchi: An schieramento il contenuto del nodo è una raccolta ordinata di zero o più nodi. Una sequenza può includere lo stesso nodo più di una volta, in particolare. Può contenere anche se stesso.
- Letterali (Stringhe, numeri, booleano, ecc.): una sequenza di zero o più Caratteri Unicode può essere utilizzato per rappresentare i dati opachi che compongono a scalare contenuto del nodo.
In questo articolo, daremo un'occhiata in particolare alla conversione del contenuto dell'array YAML in un elenco in Java. Ci sono molte librerie open source disponibili, ma le più popolari lo sono Jackson ed Snake YAML. In questa guida, useremo SnakeYaml come nostra libreria per analizzare il contenuto YAML.
Snake Yaml
Snake YAML è un pacchetto di analisi YAML che offre un'API di alto livello per la serializzazione e la deserializzazione dei documenti YAML. Il punto di ingresso per SnakeYAML è il Yaml
classe. I documenti oi file YAML possono essere caricati utilizzando load()
metodo o in batch tramite il loadAll()
metodo. I metodi prendono dati YAML autentici sotto forma di oggetti String e anche InputStreams
, che è un tipico tipo di file da incontrare.
dato che :
struttura innata nei file YAML, SnakeYAML funziona naturalmente bene con Mappe Java, ma possiamo anche usare unique Oggetti Java.
Per includere la libreria nel nostro progetto, aggiungi la seguente dipendenza a your pom.xml
file:
<dependencies>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
</dependencies>
Oppure, se stai usando Gradle:
compile group: 'org.yaml', name: 'snakeyaml', version: '1.33'
Lettura di un semplice array YAML
Iniziamo rapidamente leggendo un semplice array da un file YAML. Considera che abbiamo un file yaml con i seguenti dati nella cartella delle risorse del nostro progetto Java:
- One
- Two
- Three
- Four
Quindi possiamo caricare il contenuto del file come file InputStream
. Successivamente, costruiremo il Yaml
istanza che fungerà quindi da punto di ingresso per l'accesso alla libreria e all'oggetto per rappresentare il contenuto del file YAML in modo programmatico. Il load()
il metodo ci consente di leggere e analizzare qualsiasi InputStream
con dati YAML validi:
public void readYamlWithArray() {
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("number.yml");
Yaml yaml = new Yaml();
List data = yaml.load(inputStream);
System.out.println(data);
}
Il metodo restituirà un Java List
di dati stringa. Se stampiamo il data
quindi darà il seguente risultato:
[One, Two, Three, Four]
Lettura di un array raggruppato YAML
A volte vorremmo definire una serie di contenuti rispetto a una determinata chiave. Questo è chiamato raggruppamento di array in un nodo della mappa YAML. Un esempio di YAML di questo tipo è simile al seguente:
languages:
- Java
- JavaScript
- Python
- Golang
- Perl
- Shell
- Scala
Questo può essere considerato come Java Map
contenente un file :
dove il valore è un schieramento. Quindi i dati verranno comunque caricati come InputStream
come abbiamo definito sopra. Ma il data
deve essere definito come 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);
}
Ora se leggiamo il nostro data
, sarebbe simile a questo:
{languages=[Java, JavaScript, Python, Golang, Perl, Shell, Scala]}
Java
JavaScript
Python
Golang
Perl
Shell
Scala
Lettura di una matrice di array multilinea YAML
A volte ci imbattiamo in un file YAML con dati contenenti array di array. Ad esempio, raggruppiamo i corsi e li rappresentiamo come array di array come di seguito:
courses:
- - C
- Java
- Data Structures
- Algorithms
- - Big Data
- Spark
- Kafka
- Machine Learning
Questo può essere analizzato come Java Map
of List
of List
of String
. Possiamo di nuovo caricare il InputStream
come abbiamo fatto prima. Ma i dati verranno caricati come di seguito:
Dai un'occhiata alla nostra guida pratica e pratica per l'apprendimento di Git, con le migliori pratiche, gli standard accettati dal settore e il cheat sheet incluso. Smetti di cercare su Google i comandi Git e in realtà imparare esso!
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);
}
Quindi se stampiamo il data
, sarebbe simile al seguente:
{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
Lettura di un contenuto YAML nidificato complesso come Java Bean
Abbiamo visto come possiamo gestire il contenuto del tipo di array separatamente, ma con file YAML nidificati complessi: avere una mappa di mappe con elenchi di elenchi è difficile da analizzare intuitivamente e difficile da gestire. Anche nell'ultimo esempio in cui avevamo solo due elenchi nidificati: gestirli come elenchi diventa piuttosto prolisso.
In questi casi, è meglio creare un POJO che può essere mappato ai dati YAML nidificati. Creiamo prima un YAML di esempio contenente il contenuto nidificato di un sito Web:
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
Dobbiamo definire una classe Java madre WebsiteContent
che sarà composto da List
di abilità e a List
of Map
di tutorial che conterranno nuovamente elenchi di tag e contributori:
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 + ''' +
'}';
}
}
Ora possiamo caricare di nuovo i dati dal file come InputStream
come abbiamo fatto prima. Successivamente, quando creiamo il nostro Yaml
oggetto classe, dobbiamo specificare il tipo di dati in cui vogliamo eseguire il cast dei dati. Il new Constructor(WebsiteContent.class)
dice a SnakeYAML di leggere i dati dal file YAML e mapparlo sul nostro WebsiteContent
oggetto.
La mappatura è semplice ei nomi dei nostri attributi oggetto devono corrispondere ai nomi degli attributi 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);
}
Infine, quando stampiamo il data
, sarebbe simile al seguente:
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}}
Come possiamo vedere, SnakeYaml ha analizzato e convertito con successo il file WebsiteContent
oggetto e mantenuto l'eredità e l'associazione con Tutorial
oggetto integro.
Conclusione
Poiché i file YAML sono ampiamente utilizzati per DevOps e dati relativi alla configurazione, è molto utile analizzare e manipolare i dati utilizzando il codice.
SnakeYAML ci consente di gestire facilmente i file YAML nel nostro progetto Java e richiede solo un po' di codice per caricare i file YAML nel nostro progetto o scrivere dati nei file YAML. Inoltre, SnakeYAML offre scelte di formattazione in modo che tu possa adattarlo e personalizzarlo in base alle nostre esigenze.