YAML Array کو SnakeYAML کے ساتھ جاوا لسٹ میں تبدیل کریں۔

تعارف

یامل کے بعد سب سے زیادہ مقبول ڈیٹا سیریلائزیشن زبان میں سے ایک ہے۔ JSON. لہذا، اسے کبھی کبھی a کہا جاتا ہے۔ سخت سپر سیٹ JSON کا۔ اسے شروع سے ہی انسانی تعامل اور پڑھنے کی اہلیت کے لیے ڈیزائن کیا گیا ہے، اس لیے یہ اپنی سادگی کے لیے جانا جاتا ہے۔ یہ لچک اور رسائی کو ذہن میں رکھتے ہوئے ڈیزائن کیا گیا ہے، لہذا یہ تمام جدید پروگرامنگ زبانوں اور کنفیگریشن فائلوں کو لکھنے کے لیے ایک طاقتور فارمیٹ کے ساتھ کام کرتا ہے۔ یہ ڈیٹا کی استقامت، انٹرنیٹ میسجنگ، کراس لینگویج ڈیٹا شیئرنگ، اور بہت سے اختیارات کے لیے بھی استعمال ہوتا ہے۔

YAML کا آغاز 2001 میں ہوا تھا اور اسے "ابھی تک ایک اور مارک اپ زبان" اس وقت. لیکن بعد میں اس کا بطور ٹریڈ مارک "YAML مارک اپ لینگویج نہیں ہے۔" YAML فائل کا بنیادی ڈھانچہ ہے a نقشہ. اسے لغت، ہیش (نقشہ) یا صرف آبجیکٹ پر مبنی پروگرامنگ زبان کے نام سے بھی جانا جاتا ہے جسے ہم استعمال کرنے کا انتخاب کرتے ہیں۔

وائٹ اسپیس اور انڈینٹیشن کو YAML فائلوں میں گھوںسلا کی نشاندہی کرنے کے لیے استعمال کیا جاتا ہے۔

نوٹ: YAML فائلوں میں انڈینٹیشن کے لیے صرف خالی جگہیں استعمال کی جا سکتی ہیں۔ ٹیب حروف کی اجازت نہیں ہے۔ جب تک انڈینٹیشن مستقل طور پر کیا جاتا ہے، اس سے کوئی فرق نہیں پڑتا ہے کہ کتنی جگہیں استعمال کی جاتی ہیں۔

YAML نحو

YAML فارمیٹ بنیادی طور پر 3 نوڈ اقسام کا استعمال کرتا ہے:

  • نقشے/لغات: A نقشہ نوڈ کا مواد غیر ترتیب شدہ مجموعہ ہے۔ کلید/قدر نوڈ جوڑے، اس ضرورت کے ساتھ کہ ہر کلید الگ ہونی چاہیے۔ YAML کے ذریعہ نوڈس پر مزید کوئی پابندیاں عائد نہیں کی گئی ہیں۔
  • صفیں/ فہرستیں۔: ایک صف نوڈ کا مواد صفر یا زیادہ نوڈس کا ترتیب شدہ مجموعہ ہے۔ ایک ترتیب میں ایک ہی نوڈ ایک سے زیادہ بار شامل ہو سکتا ہے، خاص طور پر۔ اس میں خود بھی شامل ہو سکتا ہے۔
  • سواد (سٹرنگز، نمبرز، بولین وغیرہ): صفر یا اس سے زیادہ کی ترتیب یونیکوڈ حرف مبہم اعداد و شمار کی نمائندگی کرنے کے لیے استعمال کیا جا سکتا ہے جو کہ a اسکیلر نوڈ کا مواد.

اس مضمون میں، ہم خاص طور پر جاوا میں 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 مشتمل a : جہاں قدر ایک ہے۔ صف. لہذا ڈیٹا اب بھی لوڈ کیا جائے گا۔ 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 سیکھنے کے لیے ہمارے ہینڈ آن، عملی گائیڈ کو دیکھیں۔ گوگلنگ گٹ کمانڈز کو روکیں اور اصل میں سیکھ یہ!

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 مہارت اور a 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