JavaRush /مدونة جافا /Random-AR /مخطط Json: لماذا ومن يحتاج إليه

مخطط Json: لماذا ومن يحتاج إليه

نشرت في المجموعة
مرحبا أيها المتجول. اليوم أريد أن أخبركم عن القليل من السحر. ربما تكون قد سمعت بالفعل عن json. إنها لغة عالمية: تفهمها الآلات ويسهل على البشر قراءتها. فيما يلي مثال نموذجي لرسالة json:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
من الملائم التواصل بهذه الطريقة، أليس كذلك؟ إذا لم تكن تعرف ما هو json من قبل، فأنت تعرفه الآن. كيفية استخدام هذا في كود جافا؟ أصبح Json تنسيقًا عالميًا. إنه يرمز إلى JavaScript Object Notation، ولكنه تجاوز منذ فترة طويلة جافا سكريبت ويستخدم في كل مكان تقريبًا. تحتوي Java على العديد من المكتبات التي تجعل العمل مع json أسهل. وهنا الأكثر شهرة: سأستخدم الثاني. هناك نسختان منهما : 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;

}
لقد حذفت على وجه التحديد الحروف، والمحددات، والمنشئات وسمات pojo الأخرى، وإلا فسوف تتعب من الهدر =) انظر الآن هنا:
{
  "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 - سيكتب مُنشئًا generatorBuilders - سيبني منشئ الأنماط includeToString - إضافة إلى String usePrimitives - تعليمات لاستخدام البدائيات كيف يكون هذا أفضل من التعليمات البرمجية المكتوبة في المنزل ؟
  1. يمكنك تخصيص الفصول بسطر واحد. على سبيل المثال، تحتاج إلى إضافة لاحقة Pojo إلى كل فئة. ما عليك سوى إضافة <classNameSuffix>Pojo</classNameSuffix> لتجميع المشروع - وبذلك تكون قد انتهيت. وإلا فسيتعين علينا تغيير أسماء كل فئة يدويًا.

    هناك الكثير من هذه المعلمات، ومن المفيد أن تقرأ عنها جميعًا في المستندات

  2. إذا كان لمشروعك مستهلك، فسيكون من الأسهل بكثير إعطائه مخططات json بدلاً من فئات Java. وكما قلت من قبل، فإن المخططات عالمية وسيقوم المستهلك ببساطة بإنشاء pojo بلغته الخاصة.

  3. هم أصغر بكثير. يحتوي المثال أعلاه على الكثير من المعلومات التي ليست ضرورية دائمًا، على سبيل المثال الأنماط والأمثلة. ولكن إذا قمت بإعادتها إلى كود جافا، فسوف تنمو أيضًا كثيرًا. ولا تنسَ رمز القالب، والذي يُشار إليه في المخططات من خلال إعدادين في البرنامج الإضافي، ولكن عليك كتابته في الكود بنفسك. ونعم، أعرف عن لومبوك، هناك بديل.

  4. لا يوجد منطق في بوجو. عندما تكون فصولك مكتوبة ذاتيًا، قد يميل شخص ما إلى إضافة طريقة مناسبة له. لا يمكن إضافة الطريقة إلى مخطط json، وكذلك إلى الفئة التي تم إنشاؤها.

ربما هذا كل شيء.

خاتمة:

حاولت أن أنقل أن مخططات json هي تنسيق جيد جدًا للتفاعل بين المشاريع. التقيت به ذات يوم في مشروع، وقد وقع في قلبي. أستخدمها في كل مكان تقريبًا. نعم، هذا ليس مناسبًا دائمًا، لأنه من أجل عرض المصادر، تحتاج إلى تجميع المشروع. ولكن هذا أمر غير منطقي، مما يعني أنه لا يمكن أن يكون هناك منطق هناك، ولن يكون هناك أي منطق في الدوائر. ملحوظة: أحيانًا أشرح بشكل سيء، لذا إليك مقطع فيديو يحتوي على تقرير جيد: كيريل ميركوشيف - إنشاء الكود كوسيلة لحل مشكلات الأتمتة.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION