معرفی
یامل یکی از محبوب ترین زبان های سریال سازی داده ها پس از آن است JSON. بنابراین، گاهی اوقات به عنوان یک نامیده می شود سخت فوق مجموعه از JSON. از همان ابتدا برای تعامل انسانی و خوانایی طراحی شده است، از این رو، به دلیل سادگی آن شناخته شده است. این با انعطاف پذیری و دسترسی طراحی شده است، بنابراین با تمام زبان های برنامه نویسی مدرن و یک فرمت قدرتمند برای نوشتن فایل های پیکربندی کار می کند. همچنین برای تداوم داده، پیامرسانی اینترنتی، اشتراکگذاری داده بین زبانی و بسیاری از گزینههای دیگر استفاده میشود.
YAML در سال 2001 آغاز شد و به عنوان "یک زبان نشانه گذاری دیگر” در آن زمان اما بعداً با علامت تجاری "YAML زبان نشانه گذاری نیست". ساختار اصلی یک فایل YAML a نقشه. همچنین به عنوان یک فرهنگ لغت، هش (نقشه) یا به سادگی مبتنی بر شیء بر اساس زبان برنامه نویسی که ما انتخاب می کنیم شناخته می شود.
فضای خالی و تورفتگی در فایل های YAML برای نشان دادن تودرتو استفاده می شود.
توجه داشته باشید: فقط می توان از فاصله ها برای تورفتگی در فایل های YAML استفاده کرد. کاراکترهای برگه مجاز نیستند. تا زمانی که تورفتگی به طور مداوم انجام شود، مهم نیست که از چند فضا استفاده شده است.
نحو YAML
فرمت YAML در درجه اول از 3 نوع گره استفاده می کند:
- نقشه ها / فرهنگ لغت: نقشه محتوای گره مجموعه ای نامرتب از ارزش کلیدی گره جفت، با این شرط که هر کلید باید متمایز باشد. هیچ محدودیت دیگری توسط YAML بر روی گره ها اعمال نمی شود.
- آرایه ها/فهرست ها: صف محتوای گره یک مجموعه مرتب شده از صفر یا بیشتر گره است. یک دنباله ممکن است به طور خاص شامل همان گره بیش از یک بار باشد. ممکن است حتی خود را نیز در بر گیرد.
- اصطلاحات (رشته، اعداد، بولی و غیره): دنباله ای از صفر یا بیشتر نویسه های یونیکد می توان برای نشان دادن داده های مبهم تشکیل دهنده a استفاده کرد اسکالر محتوای گره
در این مقاله، ما به طور خاص نگاهی به تبدیل محتوای آرایه YAML به لیست در جاوا خواهیم داشت. کتابخانه های منبع باز زیادی وجود دارد، اما محبوب ترین آنها هستند جکسون و SnakeYAML. در این راهنما، ما از SnakeYaml به عنوان کتابخانه خود برای تجزیه محتوای YAML استفاده خواهیم کرد.
SnakeYaml
SnakeYAML یک بسته تجزیهکننده YAML است که یک API سطح بالا برای سریالسازی و جداسازی اسناد YAML ارائه میدهد. نقطه ورود SnakeYAML این است Yaml
کلاس اسناد یا فایل های YAML را می توان با استفاده از بارگیری کرد load()
روش یا به صورت دسته ای از طریق loadAll()
روش. روشها دادههای YAML واقعی را در قالب اشیاء رشتهای و همچنین InputStreams
، که یک نوع فایل معمولی برای مواجهه است.
با توجه به :
ساختار ذاتی فایل های YAML، SnakeYAML به طور طبیعی با آن به خوبی کار می کند نقشه های جاوا، اما ممکن است از منحصر به فرد نیز استفاده کنیم اشیاء جاوا.
برای گنجاندن کتابخانه در پروژه ما، وابستگی زیر را به خود اضافه کنید pom.xml
فایل:
<dependencies>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.33</version>
</dependency>
</dependencies>
یا اگر از Gradle استفاده می کنید:
compile group: 'org.yaml', name: 'snakeyaml', version: '1.33'
خواندن یک آرایه YAML ساده
بیایید به سرعت با خواندن یک آرایه ساده از یک فایل YAML شروع کنیم. در نظر بگیرید که ما یک فایل yaml با داده های زیر در پوشه منابع پروژه جاوا داریم:
- One
- Two
- Three
- Four
سپس می توانیم محتوای فایل را به صورت an بارگذاری کنیم InputStream
. در مرحله بعد، ما را می سازیم Yaml
نمونه ای که سپس به عنوان یک نقطه ورودی برای دسترسی به کتابخانه و شیء برای نمایش محتویات فایل YAML به صورت برنامه ای عمل می کند. این load()
متد به ما اجازه می دهد هر کدام را بخوانیم و تجزیه کنیم InputStream
با داده های معتبر 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);
}
این روش یک جاوا را برمی گرداند List
داده های رشته ای اگر ما چاپ کنیم data
سپس نتیجه زیر را خواهد داد:
[One, Two, Three, Four]
خواندن یک آرایه گروهی YAML
گاهی اوقات ما می خواهیم یک آرایه از محتوا را در برابر یک کلید مشخص تعریف کنیم. به این کار گروه بندی آرایه ها در یک گره نقشه YAML گفته می شود. نمونه YAML از این نوع به صورت زیر است:
languages:
- Java
- JavaScript
- Python
- Golang
- Perl
- Shell
- Scala
این را می توان به عنوان جاوا در نظر گرفت Map
حاوی یک :
که در آن مقدار یک است صف. بنابراین داده ها همچنان به صورت بارگذاری می شوند InputStream
همانطور که در بالا تعریف کردیم. اما data
باید به عنوان تعریف شود 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);
}
حالا اگر ما بخوانیم data
، چیزی شبیه به این خواهد بود:
{languages=[Java, JavaScript, Python, Golang, Perl, Shell, Scala]}
Java
JavaScript
Python
Golang
Perl
Shell
Scala
خواندن یک آرایه چند خطی YAML از آرایه ها
گاهی اوقات با یک فایل YAML مواجه می شویم که دارای داده های حاوی آرایه های آرایه است. به عنوان مثال، دوره ها را گروه بندی می کنیم و آنها را به صورت آرایه ای از آرایه ها مانند زیر نشان می دهیم:
courses:
- - C
- Java
- Data Structures
- Algorithms
- - Big Data
- Spark
- Kafka
- Machine Learning
این را می توان به عنوان جاوا تجزیه کرد Map
of List
of List
of String
. ما دوباره می توانیم بارگذاری کنیم InputStream
همانطور که قبلا انجام دادیم. اما داده ها به صورت زیر بارگذاری می شوند:
راهنمای عملی و عملی ما برای یادگیری Git را با بهترین روش ها، استانداردهای پذیرفته شده در صنعت و برگه تقلب شامل بررسی کنید. دستورات Google Git را متوقف کنید و در واقع یاد گرفتن آی تی!
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);
}
بنابراین اگر ما چاپ data
، چیزی شبیه به زیر است:
{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
خواندن یک محتوای پیچیده تو در تو YAML به عنوان جاوا Bean
ما دیدیم که چگونه میتوانیم محتوای نوع آرایه را به طور جداگانه مدیریت کنیم، اما با فایلهای تودرتو پیچیده YAML - داشتن نقشهای از نقشهها با فهرستهای فهرست به سختی قابل تجزیه و تحلیل است و مقابله با آن دشوار است. حتی در آخرین مثال که ما فقط دو لیست تودرتو داشتیم - استفاده از آنها به عنوان لیست نسبتاً پرمخاطب می شود.
در این موارد، بهتر است یک POJO ایجاد کنید که بتوان آن را به داده های تودرتوی YAML نگاشت. ابتدا یک نمونه YAML حاوی محتوای تودرتوی یک وب سایت ایجاد کنیم:
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
باید یک کلاس جاوا والد تعریف کنیم WebsiteContent
که متشکل از List
از مهارت ها و الف List
of Map
از آموزش هایی که دوباره حاوی لیستی از برچسب ها و مشارکت کنندگان است:
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 + ''' +
'}';
}
}
اکنون می توانیم دوباره داده ها را از فایل به عنوان بارگذاری کنیم InputStream
همانطور که قبلا انجام دادیم. بعد وقتی ما را ایجاد می کنیم Yaml
شی کلاس، باید نوع داده ای را که می خواهیم داده ها را درون آن ریخته کنیم، مشخص کنیم. این new Constructor(WebsiteContent.class)
به SnakeYAML میگوید که دادهها را از فایل YAML به ما بخواند WebsiteContent
هدف - شی.
نقشه برداری ساده است و نام ویژگی های شی ما باید با نام ویژگی های 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);
}
در نهایت، زمانی که ما چاپ data
، چیزی شبیه به زیر است:
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}}
همانطور که می بینیم، SnakeYaml با موفقیت تجزیه و تبدیل شده است WebsiteContent
اعتراض و ارث و همراهی با Tutorial
شی دست نخورده
نتیجه
از آنجایی که فایل های YAML به طور گسترده برای DevOps و داده های مربوط به پیکربندی استفاده می شوند، تجزیه و دستکاری داده ها با استفاده از کد بسیار مفید است.
SnakeYAML به ما اجازه می دهد تا فایل های YAML را در پروژه جاوا خود به راحتی مدیریت کنیم و برای بارگذاری فایل های YAML در پروژه یا نوشتن داده ها در فایل های YAML فقط به کمی کد نیاز دارد. علاوه بر این، SnakeYAML گزینههای قالببندی را ارائه میدهد تا بتوانید آن را مطابق با نیازهای ما تنظیم و شخصی کنید.