SnakeYAML দিয়ে YAML অ্যারেকে জাভা তালিকায় রূপান্তর করুন

ভূমিকা

YAML পরে সবচেয়ে জনপ্রিয় ডেটা সিরিয়ালাইজেশন ভাষাগুলির মধ্যে একটি তাদেরকে JSON. অতএব, এটি কখনও কখনও একটি হিসাবে বলা হয় যথাযথ সুপারসেট JSON এর। এটি শুরু থেকেই মানুষের মিথস্ক্রিয়া এবং পাঠযোগ্যতার জন্য ডিজাইন করা হয়েছে, তাই এটি তার সরলতার জন্য পরিচিত। এটি নমনীয়তা এবং অ্যাক্সেসযোগ্যতার কথা মাথায় রেখে ডিজাইন করা হয়েছে, তাই এটি সমস্ত আধুনিক প্রোগ্রামিং ভাষা এবং কনফিগারেশন ফাইল লেখার জন্য একটি শক্তিশালী বিন্যাসের সাথে কাজ করে। এটি ডেটা স্থিরতা, ইন্টারনেট মেসেজিং, ক্রস-ল্যাঙ্গুয়েজ ডেটা শেয়ারিং এবং আরও অনেক বিকল্পের জন্যও ব্যবহৃত হয়।

YAML 2001 সালে শুরু হয়েছিল এবং এটিকে বলা হয়েছিল "তবুও আরেকটি মার্কআপ ভাষা" সেই মুহূর্তে. কিন্তু পরে এটিকে ট্রেডমার্ক করা হয় "YAML মার্কআপ ভাষা নয়" একটি YAML ফাইলের মৌলিক গঠন হল a মানচিত্র. এটি একটি অভিধান, হ্যাশ (ম্যাপ) বা কেবলমাত্র অবজেক্ট-ভিত্তিক প্রোগ্রামিং ভাষা হিসাবেও পরিচিত যা আমরা ব্যবহার করতে চাই।

নেস্টিং বোঝাতে YAML ফাইলগুলিতে হোয়াইটস্পেস এবং ইন্ডেন্টেশন ব্যবহার করা হয়।

বিঃদ্রঃ: YAML ফাইলে ইন্ডেন্টেশনের জন্য শুধুমাত্র স্পেস ব্যবহার করা যেতে পারে; ট্যাব অক্ষর অনুমোদিত নয়। যতক্ষণ না ইন্ডেন্টেশন ধারাবাহিকভাবে করা হয়, কতগুলি স্পেস ব্যবহার করা হয়েছে তা বিবেচ্য নয়।

YAML সিনট্যাক্স

একটি YAML ফর্ম্যাট প্রাথমিকভাবে 3 নোড প্রকার ব্যবহার করে:

  • মানচিত্র/অভিধান: একটি মানচিত্র নোডের বিষয়বস্তু হল একটি ক্রমহীন সংগ্রহ প্রকৃত মূল্য নোড জোড়া, প্রয়োজনের সাথে যে প্রতিটি কী আলাদা হতে হবে। YAML দ্বারা নোডগুলিতে আর কোন সীমাবদ্ধতা আরোপ করা হয় না।
  • অ্যারে/তালিকা: একটি বিন্যাস নোডের বিষয়বস্তু হল শূন্য বা তার বেশি নোডের একটি অর্ডারকৃত সংগ্রহ। একটি ক্রম একই নোড একাধিকবার অন্তর্ভুক্ত করতে পারে, বিশেষ করে। এটা এমনকি নিজেকে ধারণ করতে পারে.
  • সাহিত্যের (স্ট্রিং, সংখ্যা, বুলিয়ান, ইত্যাদি): শূন্য বা তার বেশি একটি ক্রম ইউনিকোড অক্ষর একটি অস্বচ্ছ ডেটা উপস্থাপন করতে ব্যবহার করা যেতে পারে যা একটি তৈরি করে স্কেলার নোডের বিষয়বস্তু।

এই নিবন্ধে, আমরা বিশেষভাবে জাভাতে YAML অ্যারে বিষয়বস্তুকে একটি তালিকায় রূপান্তর করার বিষয়ে নজর দেব। প্রচুর ওপেন সোর্স লাইব্রেরি পাওয়া যায় কিন্তু সেগুলোর মধ্যে সবচেয়ে জনপ্রিয় জ্যাকসন এবং SnakeYAML. এই গাইডে, আমরা YAML বিষয়বস্তু পার্স করতে আমাদের লাইব্রেরি হিসাবে SnakeYaml ব্যবহার করব।

স্নেকইয়ামল

SnakeYAML একটি YAML-পার্সিং প্যাকেজ যা YAML ডকুমেন্ট সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের জন্য একটি উচ্চ-স্তরের API অফার করে। 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

তারপরে আমরা ফাইলের বিষয়বস্তুটিকে একটি হিসাবে লোড করতে পারি 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 যেমন আমরা আগে করেছি। কিন্তু ডাটা নিচের মত লোড হবে:

সেরা-অভ্যাস, শিল্প-স্বীকৃত মান এবং অন্তর্ভুক্ত চিট শীট সহ গিট শেখার জন্য আমাদের হ্যান্ডস-অন, ব্যবহারিক গাইড দেখুন। গুগলিং গিট কমান্ড এবং আসলে বন্ধ করুন শেখা এটা!

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 সামগ্রী পড়া

আমরা দেখেছি কিভাবে আমরা আলাদাভাবে অ্যারে টাইপ বিষয়বস্তু পরিচালনা করতে পারি, কিন্তু জটিল নেস্টেড 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