JavaRush /وبلاگ جاوا /Random-FA /طرح Json: چرا و چه کسی به آن نیاز دارد

طرح Json: چرا و چه کسی به آن نیاز دارد

در گروه منتشر شد
سلام سرگردان امروز می خواهم در مورد یک جادوی کوچک به شما بگویم. احتمالاً قبلاً در مورد json شنیده اید. این یک زبان جهانی است: توسط ماشین ها قابل درک است و توسط انسان به راحتی خوانده می شود. در اینجا یک مثال معمولی از پیام json آورده شده است:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
برقراری چنین ارتباطی راحت است، اینطور نیست؟ اگر قبلاً نمی دانستید json چیست، اکنون می دانید. چگونه از این در کد جاوا استفاده کنیم؟ Json به یک قالب جهانی تبدیل شده است. مخفف عبارت JavaScript Object Notation است، اما مدتهاست که فراتر از جاوا اسکریپت رفته است و تقریباً در همه جا استفاده می شود. جاوا چندین کتابخانه دارد که کار با 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 می سازد - بهString usePrimitives اضافه می کند - دستورالعملی برای استفاده از primitives چگونه این بهتر از کدهای نوشته شده در خانه است. ?
  1. شما می توانید کلاس ها را با یک خط سفارشی کنید. به عنوان مثال، شما باید پسوند Pojo را به هر کلاس اضافه کنید. فقط <classNameSuffix>Pojo</classNameSuffix> را برای مونتاژ پروژه اضافه کنید - و کار شما تمام شد. در غیر این صورت، باید نام هر کلاس را به صورت دستی تغییر دهیم.

    تعداد زیادی از این پارامترها وجود دارد، خواندن همه آنها در اسناد ارزش دارد

  2. اگر پروژه شما مصرف کننده داشته باشد، دادن طرحواره های json به جای کلاس های جاوا بسیار آسان تر خواهد بود. همانطور که قبلاً گفتم، طرح ها جهانی هستند و مصرف کننده به سادگی پوجو را به زبان خود تولید می کند.

  3. آنها بسیار کوچکتر هستند. مثال بالا حاوی اطلاعات زیادی است که همیشه لازم نیست، به عنوان مثال، الگوها و نمونه ها. اما اگر آنها را به کد جاوا برگردانید، رشد زیادی نیز خواهد داشت. و کد قالب را فراموش نکنید، که در نمودارها با چند تنظیمات در افزونه نشان داده شده است، اما باید خودتان آن را در کد بنویسید. و بله، من در مورد Lombok می دانم، یک جایگزین وجود دارد.

  4. هیچ منطقی در پوجو وجود ندارد. وقتی کلاس‌های شما توسط خود نوشته می‌شوند، ممکن است کسی وسوسه شود که روشی را که برای او مناسب است اضافه کند. متد را نمی توان به طرحواره json و همچنین به کلاس تولید شده اضافه کرد.

احتمالاً همین است.

نتیجه:

من سعی کردم بیان کنم که طرح های json فرمت بسیار خوبی برای تعامل بین پروژه ها هستند. یک روز در یک پروژه با او آشنا شدم و او به قلب من افتاد. تقریبا همه جا ازشون استفاده میکنم بله، این همیشه راحت نیست، زیرا برای مشاهده منابع، باید پروژه را مونتاژ کنید. اما این pojo است، به این معنی که منطقی وجود ندارد، و هیچ منطقی در مدارها وجود نخواهد داشت. PS.. گاهی اوقات من ضعیف توضیح می دهم، بنابراین در اینجا یک ویدیو با یک گزارش خوب است: Kirill Merkushev - تولید کد به عنوان راهی برای حل مشکلات اتوماسیون.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION