با SnakeYAML آرایه YAML را به فهرست جاوا تبدیل کنید

معرفی

یامل یکی از محبوب ترین زبان های سریال سازی داده ها پس از آن است 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 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);
}

حالا اگر ما بخوانیم 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 گزینه‌های قالب‌بندی را ارائه می‌دهد تا بتوانید آن را مطابق با نیازهای ما تنظیم و شخصی کنید.

تمبر زمان:

بیشتر از Stackabuse