JavaRush /Java blogi /Random-UZ /Json sxemasi: nima uchun va kimga kerak

Json sxemasi: nima uchun va kimga kerak

Guruhda nashr etilgan
Salom, sayohatchi. Bugun men sizga bir oz sehr haqida gapirib bermoqchiman. Siz allaqachon json haqida eshitgansiz. Bu shunday universal til: u mashinalar tomonidan tushuniladi va odamlar tomonidan osongina o'qiladi. Bu json xabarining odatiy misoli:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
Bunday muloqot qilish qulay, shunday emasmi? Agar siz ilgari json nima ekanligini bilmasangiz, endi bilasiz. Buni java kodida qanday ishlatish kerak? Json universal formatga aylandi. Bu JavaScript Object Notation degan ma'noni anglatadi, lekin uzoq vaqt davomida JavaScript-dan tashqariga chiqdi va deyarli hamma joyda qo'llaniladi. Java-da json bilan ishlashni osonlashtiradigan bir nechta kutubxonalar mavjud. Mana eng mashhurlari: Men ikkinchisidan foydalanaman. Ularning ikkita versiyasi mavjud : codehaus va fasterxml , men ularda hech qanday farqni sezmadim, shuning uchun bu erda istalganidan foydalanishingiz mumkin. Mana bir parcha kod:
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue("сюда json", "сюда класс");
json ni ob'ektga tarjima qilishga yordam beradi. Va biz eng muhim narsaga yaqinlashamiz. Ushbu json uchun sinf yozish. Buni qo'lda qilishingiz mumkin, shunga o'xshash tuzilma yaratishingiz mumkin:
-----------------------------------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;

}
Men ayniqsa, oluvchilar, setterlar, konstruktorlar va boshqa pojo atributlarini o'tkazib yubordim, aks holda siz isrof qilishdan charchadingiz =) Endi bu yerga qarang:
{
  "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
}
Bu yuqoridagi strukturaning json diagrammasi. Endi bu nima uchun kerakligini tushuntirish vaqti keldi. Bu sinflarni yozish va ularni saqlash zaruriyatini yo'q qiladi. Bunday yaxshi loyiha bor jsonschema2pojo . U loyiha quruvchilari (Maven, Gradle) uchun plaginlarni taklif etadi, ular qurilish vaqtida siz uchun ushbu sinflarni yozadi. Mana mening loyihamdan bir misol:
<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>
Bu uning sozlamalari. Eng qiziq narsa bu erda:
<useCommonsLang3>true</useCommonsLang3>
<includeConstructors>true</includeConstructors>
<generateBuilders>true</generateBuilders>
<includeToString>true</includeToString>
<usePrimitives>true</usePrimitives>
Bu sinfni qanday yozish bo'yicha ko'rsatma: useCommonsLang3 - CommonsLang3 kutubxonasidan foydalaning includeConstructors - konstruktorni yozadi generatorBuilders - naqsh yaratuvchisini quradi includeToString - toStringga qo'shish usePrimitives - primitivlardan foydalanish bo'yicha ko'rsatma Bu uyda yozilgan koddan qanday yaxshiroq? ?
  1. Siz sinflarni bir qator bilan sozlashingiz mumkin. Misol uchun, har bir sinfga Pojo qo'shimchasini qo'shishingiz kerak. Loyihani yig'ish uchun faqat <classNameSuffix>Pojo</classNameSuffix> qo'shing - va siz tugatdingiz. Aks holda, biz har bir sinf nomini qo'lda o'zgartirishimiz kerak edi.

    Ushbu parametrlar juda ko'p, ularning barchasi haqida hujjatlarda o'qishga arziydi

  2. Agar loyihangizda iste'molchi bo'lsa, unga java sinflarini emas, balki json sxemalarini berish osonroq bo'ladi. Yuqorida aytib o'tganimdek, sxemalar universaldir va iste'molchi shunchaki o'z tilida pojo yaratadi.

  3. Ular ancha kichikroq. Yuqoridagi misolda har doim ham zarur bo'lmagan juda ko'p ma'lumotlar mavjud, masalan, naqsh va misollar. Ammo agar siz ularni java kodiga qaytarsangiz, u ham juda ko'p o'sadi. Va plagindagi bir nechta sozlamalar bilan diagrammalarda ko'rsatilgan shablon kodi haqida unutmang, lekin uni kodga o'zingiz yozishingiz kerak. Va ha, men Lombok haqida bilaman, alternativa bor.

  4. Pojoda mantiq yo'q. Sinflaringiz o'z-o'zidan yozilgan bo'lsa, kimdir ular uchun qulay bo'lgan usulni qo'shish vasvasasiga tushishi mumkin. Usulni json sxemasiga, shuningdek yaratilgan sinfga qo'shib bo'lmaydi.

Balki hammasi shu.

Xulosa:

Men json sxemalari loyihalar o'rtasidagi o'zaro aloqa uchun juda yaxshi format ekanligini aytishga harakat qildim. Bir kuni men u bilan loyihada uchrashdim va u mening yuragimga tushdi. Men ularni deyarli hamma joyda ishlataman. Ha, bu har doim ham qulay emas, chunki manbalarni ko'rish uchun siz loyihani yig'ishingiz kerak. Ammo bu pojo, ya'ni u erda mantiq bo'lishi mumkin emas va sxemalar bo'lmaydi. PS.. ba'zida men yomon tushuntiraman, shuning uchun bu erda yaxshi hisobotga ega video: Kirill Merkushev - Kod yaratish avtomatlashtirish muammolarini hal qilish usuli sifatida.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION