JavaRush /جاوا بلاگ /Random-UR /Json اسکیم: کیوں اور کس کو اس کی ضرورت ہے۔

Json اسکیم: کیوں اور کس کو اس کی ضرورت ہے۔

گروپ میں شائع ہوا۔
ہیلو، آوارہ۔ آج میں آپ کو ایک چھوٹے جادو کے بارے میں بتانا چاہتا ہوں۔ آپ نے شاید پہلے ہی json کے بارے میں سنا ہوگا۔ یہ ایسی آفاقی زبان ہے: اسے مشینیں سمجھتی ہیں اور انسان آسانی سے پڑھ سکتے ہیں۔ یہاں json پیغام کی ایک عام مثال ہے:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
اس طرح بات چیت کرنا آسان ہے، ہے نا؟ اگر آپ نہیں جانتے تھے کہ json پہلے کیا تھا، اب آپ کرتے ہیں۔ اسے جاوا کوڈ میں کیسے استعمال کریں؟ Json ایک عالمگیر شکل بن گیا ہے۔ اس کا مطلب JavaScript آبجیکٹ نوٹیشن ہے، لیکن یہ جاوا اسکرپٹ سے بہت آگے نکل گیا ہے اور تقریباً ہر جگہ استعمال ہوتا ہے۔ جاوا میں کئی لائبریریاں ہیں جو json کے ساتھ کام کرنا آسان بناتی ہیں۔ یہاں سب سے زیادہ مشہور ہیں: میں دوسرا استعمال کروں گا۔ ان کے 2 ورژن ہیں : codehaus اور fasterxml ، میں نے ان میں کوئی فرق محسوس نہیں کیا، لہذا آپ یہاں کسی کو بھی استعمال کر سکتے ہیں۔ یہاں کوڈ کا ایک ٹکڑا ہے:
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue("сюда json", "сюда класс");
json کو کسی شے میں ترجمہ کرنے میں مدد کرے گا۔ اور ہم سب سے اہم چیز کے قریب پہنچ رہے ہیں۔ اس json کے لیے کلاس لکھنا۔ آپ یہ دستی طور پر کر سکتے ہیں، ایک ڈھانچہ کچھ اس طرح بنا سکتے ہیں:
-----------------------------------com.fairytale.Base.java-----------------------------------

package com.fairytale;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;


@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"type",
"quantity"
})
public class Base {

@JsonProperty("type")
public String type = "";
@JsonProperty("quantity")
public int quantity = 0;

}
-----------------------------------com.fairytale.Hut.java-----------------------------------

package com.fairytale;

import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;


@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"room",
"base",
"residents",
"location"
})
public class Hut {

@JsonProperty("room")
public Room room;
@JsonProperty("base")
public Base base;
@JsonProperty("residents")
public List<Resident> residents = new ArrayList<Resident>();
@JsonProperty("location")
public Location location;

}
-----------------------------------com.fairytale.Location.java-----------------------------------

package com.fairytale;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;


@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"address"
})
public class Location {

@JsonProperty("address")
public String address = "";

}
-----------------------------------com.fairytale.Resident.java-----------------------------------

package com.fairytale;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;


@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"name",
"profile"
})
public class Resident {

@JsonProperty("name")
public String name = "";
@JsonProperty("profile")
public String profile = "";

}
-----------------------------------com.fairytale.Room.java-----------------------------------

package com.fairytale;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"name",
"reasonable"
})
public class Room {

@JsonProperty("name")
public String name = "";
@JsonProperty("reasonable")
public boolean reasonable = false;

}
میں نے خاص طور پر گیٹرز، سیٹٹرز، کنسٹرکٹرز اور پوجو کے دیگر اوصاف کو چھوڑ دیا، ورنہ آپ ضائع کرتے کرتے تھک جائیں گے =) اب یہاں دیکھیں:
{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://example.com/root.json",
  "type": "object",
  "title": "The Root Schema",
  "required": [
    "room",
    "base",
    "residents",
    "location"
  ],
  "properties": {
    "room": {
      "$id": "#/properties/room",
      "type": "object",
      "title": "The Room Schema",
      "required": [
        "name",
        "reasonable"
      ],
      "properties": {
        "name": {
          "$id": "#/properties/room/properties/name",
          "type": "string",
          "title": "The Name Schema",
          "default": "",
          "examples": [
            "избушка"
          ],
          "pattern": "^(.*)$"
        },
        "reasonable": {
          "$id": "#/properties/room/properties/reasonable",
          "type": "boolean",
          "title": "The Reasonable Schema",
          "default": false,
          "examples": [
            true
          ]
        }
      },
	"additionalProperties": false
    },
    "base": {
      "$id": "#/properties/base",
      "type": "object",
      "title": "The Base Schema",
      "required": [
        "type",
        "quantity"
      ],
      "properties": {
        "type": {
          "$id": "#/properties/base/properties/type",
          "type": "string",
          "title": "The Type Schema",
          "default": "",
          "examples": [
            "курьи ноги"
          ],
          "pattern": "^(.*)$"
        },
        "quantity": {
          "$id": "#/properties/base/properties/quantity",
          "type": "integer",
          "title": "The Quantity Schema",
          "default": 0,
          "examples": [
            2
          ]
        }
      },
	"additionalProperties": false
    },
    "residents": {
      "$id": "#/properties/residents",
      "type": "array",
      "title": "The Residents Schema",
      "items": {
        "$id": "#/properties/residents/items",
        "type": "object",
        "title": "The Items Schema",
        "required": [
          "name",
          "profile"
        ],
        "properties": {
          "name": {
            "$id": "#/properties/residents/items/properties/name",
            "type": "string",
            "title": "The Name Schema",
            "default": "",
            "examples": [
              "Баба Яга"
            ],
            "pattern": "^(.*)$"
          },
          "profile": {
            "$id": "#/properties/residents/items/properties/profile",
            "type": "string",
            "title": "The Profile Schema",
            "default": "",
            "examples": [
              "ведьма"
            ],
            "pattern": "^(.*)$"
          }
        },
	    "additionalProperties": false
      }
    },
    "location": {
      "$id": "#/properties/location",
      "type": "object",
      "title": "The Location Schema",
      "required": [
        "address"
      ],
      "properties": {
        "address": {
          "$id": "#/properties/location/properties/address",
          "type": "string",
          "title": "The Address Schema",
          "default": "",
          "examples": [
            "граница леса"
          ],
          "pattern": "^(.*)$",
		  "additionalProperties": false
        }
      },
	"additionalProperties": false
    }
  },
	"additionalProperties": false
}
یہ اوپر کی ساخت کا json ڈایاگرام ہے۔ اب یہ بتانے کا وقت آگیا ہے کہ آپ کو اس کی ضرورت کیوں ہے۔ اس سے کلاسز لکھنے اور انہیں برقرار رکھنے کی ضرورت ختم ہو جائے گی۔ اتنا اچھا پروجیکٹ ہے jsonschema2pojo ۔ یہ پروجیکٹ بلڈرز (Maven، Gradle) کے لیے پلگ ان پیش کرتا ہے جو آپ کے لیے یہ کلاسیں تعمیر کے وقت لکھیں گے۔ یہاں میرے منصوبے سے ایک مثال ہے:
<plugin>
    <groupId>org.jsonschema2pojo</groupId>
    <artifactId>jsonschema2pojo-maven-plugin</artifactId>
    <version>0.4.37</version>

    <executions>
        <execution>
            <id>jsonschema2opjo</id>
            <configuration>
                <sourceDirectory>${project.basedir}/src/main/resources/json-schema/</sourceDirectory>
                <targetPackage>tester.model</targetPackage>
                <outputDirectory>${project.basedir}/target/generated-sources/jsonschema/</outputDirectory>
                <useCommonsLang3>true</useCommonsLang3>
                <includeConstructors>true</includeConstructors>
                <generateBuilders>true</generateBuilders>
                <includeToString>true</includeToString>
                <usePrimitives>true</usePrimitives>
            </configuration>
            <goals>
                <goal>generate</goal>
            </goals>
            <phase>generate-sources</phase>
        </execution>
    </executions>
</plugin>
یہ اس کی ترتیب ہے۔ سب سے دلچسپ بات یہاں ہے:
<useCommonsLang3>true</useCommonsLang3>
<includeConstructors>true</includeConstructors>
<generateBuilders>true</generateBuilders>
<includeToString>true</includeToString>
<usePrimitives>true</usePrimitives>
یہ کلاس لکھنے کے طریقے کے بارے میں ایک ہدایت ہے: useCommonsLang3 - CommonsLang3 لائبریری کا استعمال کریں includeConstructors - ایک کنسٹرکٹر generateBuilders لکھے گا - ایک پیٹرن بلڈر بنائے گا includeToString - add toString usePrimitives - پرائمیٹوز کو استعمال کرنے کی ہدایت یہ گھر کے لکھے ہوئے کوڈ سے کیسے بہتر ہے ?
  1. آپ ایک لائن کے ساتھ کلاسز کو اپنی مرضی کے مطابق بنا سکتے ہیں۔ مثال کے طور پر، آپ کو ہر کلاس میں پوجو لاحقہ شامل کرنے کی ضرورت ہے۔ پروجیکٹ کو اکٹھا کرنے کے لیے بس <classNameSuffix>Pojo</classNameSuffix> شامل کریں - اور آپ کا کام ہو گیا۔ بصورت دیگر، ہمیں ہر کلاس کے نام دستی طور پر تبدیل کرنے پڑیں گے۔

    ان میں سے بہت سارے پیرامیٹرز ہیں، یہ ان سب کے بارے میں دستاویزات میں پڑھنے کے قابل ہے۔

  2. اگر آپ کے پروجیکٹ کا صارف ہے، تو اسے جاوا کلاسز کے بجائے json اسکیما دینا بہت آسان ہوگا۔ جیسا کہ میں پہلے ہی کہہ چکا ہوں، اسکیمیں عالمگیر ہیں اور صارف صرف اپنی زبان میں پوجو تیار کرے گا۔

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

  4. پوجو میں کوئی منطق نہیں۔ جب آپ کی کلاسیں خود لکھی جاتی ہیں، تو کوئی ایسا طریقہ شامل کرنے کا لالچ دے سکتا ہے جو ان کے لیے آسان ہو۔ طریقہ کو json اسکیما کے ساتھ ساتھ تیار کردہ کلاس میں شامل نہیں کیا جا سکتا۔

شاید بس اتنا ہی ہے۔

نتیجہ:

میں نے یہ بتانے کی کوشش کی کہ json اسکیمیں پروجیکٹس کے درمیان تعامل کے لیے ایک بہت اچھا فارمیٹ ہے۔ ایک دن میں ایک پروجیکٹ پر اس سے ملا، اور وہ میرے دل میں اتر گیا۔ میں انہیں تقریباً ہر جگہ استعمال کرتا ہوں۔ جی ہاں، یہ ہمیشہ آسان نہیں ہے، کیونکہ ذرائع کو دیکھنے کے لئے، آپ کو پروجیکٹ کو جمع کرنے کی ضرورت ہے. لیکن یہ پوجو ہے، جس کا مطلب ہے کہ وہاں منطق نہیں ہو سکتی، اور سرکٹس کے ساتھ کوئی نہیں ہوگا۔ PS.. کبھی کبھی میں خراب طریقے سے وضاحت کرتا ہوں، لہذا یہاں ایک اچھی رپورٹ کے ساتھ ایک ویڈیو ہے: Kirill Merkushev - آٹومیشن کے مسائل کو حل کرنے کے طریقے کے طور پر کوڈ تیار کرنا۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION