JavaRush /Java Blogu /Random-AZ /Json sxemi: niyə və kimə lazımdır

Json sxemi: niyə və kimə lazımdır

Qrupda dərc edilmişdir
Salam, sərgərdan. Bu gün sizə bir az sehrdən danışmaq istəyirəm. Yəqin ki, siz artıq json haqqında eşitmisiniz. Bu, belə universal bir dildir: maşınlar tərəfindən başa düşülür və insanlar tərəfindən asanlıqla oxunur. Budur json mesajının tipik bir nümunəsi:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
Belə ünsiyyət qurmaq rahatdır, elə deyilmi? Əvvəllər json-un nə olduğunu bilmirsinizsə, indi bilirsiniz. Bunu java kodunda necə istifadə etmək olar? Json universal formata çevrildi. O, JavaScript Object Notation mənasını verir, lakin çoxdan javascript-dən kənara çıxıb və demək olar ki, hər yerdə istifadə olunur. Java-da json ilə işləməyi asanlaşdıran bir neçə kitabxana var. Budur ən məşhurları: İkincisini istifadə edəcəm. Onların 2 versiyası var : codehausfasterxml , mən onlarda heç bir fərq görmədim, ona görə də hər hansı birini burada istifadə edə bilərsiniz. Budur bir kod parçası:
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue("сюда json", "сюда класс");
json-u obyektə çevirməyə kömək edəcək. Və ən vacib şeyə yaxınlaşırıq. Bu json üçün sinif yazın. Bunu əl ilə edə bilərsiniz, belə bir quruluş yarada bilərsiniz:
-----------------------------------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;

}
Xüsusi olaraq alıcıları, təyinçiləri, konstruktorları və digər pojo atributlarını buraxdım, əks halda israf etməkdən yorulacaqsınız =) İndi bura baxın:
{
  "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 yuxarıdakı strukturun json diaqramıdır. İndi niyə ehtiyacınız olduğunu izah etməyin vaxtı gəldi. Bu, siniflər yazmaq və onları saxlamaq ehtiyacını aradan qaldıracaq. Belə yaxşı bir layihə var jsonschema2pojo . O, layihə qurucuları üçün (Maven, Gradle) plaginlər təklif edir ki, onlar tikinti zamanı sizin üçün bu dərsləri yazacaqlar. Layihəmdən bir nümunə:
<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 onun quruluşudur. Ən maraqlısı buradadır:
<useCommonsLang3>true</useCommonsLang3>
<includeConstructors>true</includeConstructors>
<generateBuilders>true</generateBuilders>
<includeToString>true</includeToString>
<usePrimitives>true</usePrimitives>
Bu, sinfin necə yazılması ilə bağlı təlimatdır: useCommonsLang3 - CommonsLang3 kitabxanasından istifadə edin, includeConstructors - konstruktor yaratacaq.Builders - nümunə qurucusu yaradacaq includeToString - toString-ə əlavə edin usePrimitives - primitivlərdən istifadə üçün təlimat Bu evdə yazılmış koddan nə dərəcədə yaxşıdır ?
  1. Dərsləri bir xətt ilə fərdiləşdirə bilərsiniz. Məsələn, hər sinifə Pojo şəkilçisi əlavə etməlisiniz. Layihəni yığmaq üçün sadəcə <classNameSuffix>Pojo</classNameSuffix> əlavə edin - və işiniz bitdi. Əks halda, hər bir sinfin adını əl ilə dəyişməli olacağıq.

    Bu parametrlərin çoxu var, hamısı haqqında sənədlərdə oxumağa dəyər

  2. Əgər layihənizin istehlakçısı varsa, ona java sinifləri deyil, json sxemləri vermək daha asan olacaq. Artıq dediyim kimi, sxemlər universaldır və istehlakçı sadəcə öz dilində pojo yaradacaq.

  3. Onlar daha kiçikdir. Yuxarıdakı nümunədə həmişə lazım olmayan çoxlu məlumatlar var, məsələn, nümunələr və nümunələr. Ancaq onları java koduna qaytarsanız, bu da çox artacaq. Plugindəki bir neçə parametr ilə diaqramlarda göstərilən şablon kodunu unutma, ancaq kodu özünüz yazmalısınız. Bəli, Lombok haqqında bilirəm, alternativ var.

  4. Pojoda məntiq yoxdur. Dərsləriniz öz-özünə yazıldıqda, kimsə onlar üçün əlverişli bir üsul əlavə etmək üçün şirnikləndirilə bilər. Metod json sxeminə, eləcə də yaradılan sinifə əlavə edilə bilməz.

Yəqin ki, hamısı budur.

Nəticə:

Mən çatdırmağa çalışdım ki, json sxemləri layihələr arasında qarşılıqlı əlaqə üçün çox yaxşı formatdır. Bir gün onunla bir layihədə tanış oldum və o, ürəyimə düşdü. Onları demək olar ki, hər yerdə istifadə edirəm. Bəli, bu həmişə əlverişli deyil, çünki mənbələrə baxmaq üçün layihəni yığmaq lazımdır. Ancaq bu pojodur, yəni orada məntiq ola bilməz və sxemlərlə heç biri olmayacaq. P.S.. bəzən mən zəif izah edirəm, ona görə də yaxşı hesabatı olan videonu təqdim edirik: Kirill Merkuşev - Kod yaratmaq avtomatlaşdırma problemlərini həll etmək üsulu kimi.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION