JavaRush /Java блогы /Random-KK /Json схемасы: ол не үшін және кімге қажет

Json схемасы: ол не үшін және кімге қажет

Топта жарияланған
Сәлем, саяхатшы. Бүгін мен сендерге кішкентай сиқыр туралы айтқым келеді. Сіз json туралы естіген шығарсыз. Бұл әмбебап тіл: оны машиналар түсінеді және адамдар оңай оқиды. Міне, json хабарламасының әдеттегі мысалы:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
Бұлай сөйлесу ыңғайлы, солай емес пе? Егер сіз бұрын json не екенін білмесеңіз, қазір білесіз. Мұны java codeында қалай пайдалануға болады? Json әмбебап форматқа айналды. Ол JavaScript Object Notation дегенді білдіреді, бірақ JavaScript-тен әлдеқашан шығып кеткен және барлық жерде дерлік қолданылады. Java-да json-мен жұмыс істеуді жеңілдететін бірнеше кітапхана бар. Мұнда ең танымал: Мен екіншісін қолданамын. Олардың 2 нұсқасы бар : codehaus және fasterxml , мен оларда ешқандай айырмашылықты байқамадым, сондықтан кез келгенін осында пайдалана аласыз. Міне, codeтың бір бөлігі:
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 - конструкторды жазады Builders - үлгі құрастырушысын жасайды includeToString - қосу toString usePrimitives - примитивтерді пайдалану нұсқаулығы Бұл үйде жазылған codeқа қарағанда қаншалықты жақсы? ?
  1. Бір жолмен сыныптарды теңшеуге болады. Мысалы, әр сыныпқа Pojo жұрнағын қосу керек. Жобаны құрастыру үшін жай ғана <classNameSuffix>Pojo</classNameSuffix> қосыңыз - және сіз аяқтадыңыз. Әйтпесе, әр сыныптың атын қолмен өзгертуге тура келеді.

    Бұл параметрлер өте көп, олардың барлығы туралы құжаттардан оқыған жөн

  2. Егер сіздің жобаңызда тұтынушы болса, оған java сыныптарынан гөрі json схемаларын беру оңайырақ болады. Жоғарыда айтқанымдай, схемалар әмбебап және тұтынушы жай ғана өз тілінде пожо жасайды.

  3. Олар әлдеқайда аз. Жоғарыдағы мысалда әрқашан қажет емес көптеген ақпарат бар, мысалы, үлгілер мен мысалдар. Бірақ егер сіз оларды java codeына қайтарсаңыз, ол да көп өседі. Плагиндегі бірнеше параметрлермен диаграммаларда көрсетілген үлгі codeы туралы ұмытпаңыз, бірақ оны codeқа өзіңіз жазуыңыз керек. Иә, мен Ломбок туралы білемін, балама бар.

  4. Поджода логика жоқ. Сіздің сабақтарыңыз өздігінен жазылған кезде, біреу оларға ыңғайлы әдісті қосуға азғырылуы мүмкін. Әдісті json схемасына, сондай-ақ жасалған сыныпқа қосу мүмкін емес.

Бәрі осы шығар.

Қорытынды:

Мен json схемалары жобалар арасындағы өзара әрекеттесу үшін өте жақсы формат екенін жеткізуге тырыстым. Бір күні мен оны жобада кездестірдім, ол менің жүрегімде болды. Мен оларды барлық жерде дерлік қолданамын. Иә, бұл әрқашан ыңғайлы емес, өйткені көздерді көру үшін жобаны жинау керек. Бірақ бұл пожо, яғни ол жерде логика болмайды және схемалар болмайды. PS.. кейде мен нашар түсіндіремін, сондықтан жақсы баяндамасы бар бейне: Кирилл Меркушев - Код генерациялау автоматтандыру мәселелерін шешу тәсілі ретінде.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION