JavaRush /Блоги Java /Random-TG /Нақшаи Json: чаро ва ба кӣ лозим аст

Нақшаи Json: чаро ва ба кӣ лозим аст

Дар гурӯҳ нашр шудааст
Салом, саргардон. Имрӯз ман мехоҳам ба шумо дар бораи ҷодугарии каме нақл кунам. Шумо эҳтимол аллакай дар бораи json шунидаед. Ин як забони универсалӣ аст: онро мошинҳо мефаҳманд ва одамон ба осонӣ мехонанд. Ин аст як мисоли маъмулии паёми json:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
Чунин муошират кардан қулай аст, ҳамин тавр не? Агар шумо пештар намедонед, ки json чист, ҳоло шумо мекунед. Инро дар codeи java чӣ тавр истифода бурдан мумкин аст? Json ба формати универсалӣ табдил ёфтааст. Он ба JavaScript Object Notation ишора мекунад, аммо кайҳо аз JavaScript берун рафтааст ва тақрибан дар ҳама ҷо истифода мешавад. Java дорои якчанд китобхонаҳоест, ки кор бо jsonро осонтар мекунад. Инҳоянд машҳуртаринҳо: Ман дуюмро истифода мебарам. 2 versionи онҳо вуҷуд доранд : codehaus ва fasterxml , ман дар онҳо ҳеҷ фарқияте надидаам, аз ин рӯ шумо метавонед дар ин ҷо ягонтоашро истифода баред. Ин аст як пораи code:
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue("сюда json", "сюда класс");
тарҷумаи json ба an object кӯмак хоҳад кард. Ва мо ба чизи аз хама мухим наздик шуда истодаем. Навиштани синф барои ин 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 - созанда тавлид мекунадBuilders - созандаи намуна месозад includeToString - илова ба toString usePrimitives - дастур оид ба истифодаи примитивҳо Чӣ тавр ин аз codeи дар хона навишташуда беҳтар аст ?
  1. Шумо метавонед дарсҳоро бо як сатр танзим кунед. Масалан, шумо бояд ба ҳар як синф суффикси Pojo илова кунед. Барои ҷамъ кардани лоиҳа танҳо <classNameSuffix>Pojo</classNameSuffix>-ро илова кунед - ва шумо тамом шудед. Дар акси ҳол, мо бояд номи ҳар як синфро дастӣ иваз кунем.

    Ин параметрҳо зиёданд, дар бораи онҳо дар ҳуҷҷатҳо хондан лозим аст

  2. Агар лоиҳаи шумо истеъмолкунанда дошта бошад, ба он на дарсҳои java, балки ба он схемаҳои json додан осонтар хоҳад буд. Тавре ки ман аллакай гуфтам, схемаҳо универсалӣ мебошанд ва истеъмолкунанда танҳо бо забони худ pojo тавлид мекунад.

  3. Онҳо хеле хурдтаранд. Мисоли дар боло овардашуда маълумоти зиёде дорад, ки на ҳамеша заруранд, масалан, намунаҳо ва мисолҳо. Аммо агар шумо онҳоро ба codeи java баргардонед, он низ хеле меафзояд. Ва дар бораи рамзи шаблон фаромӯш накунед, ки дар диаграммаҳо бо якчанд танзимот дар плагин нишон дода шудааст, аммо шумо бояд онро дар code худатон нависед. Ва ҳа, ман дар бораи Ломбок медонам, алтернатива вуҷуд дорад.

  4. Дар pojo мантиқ нест. Вақте ки дарсҳои шумо худнавис мешаванд, касе метавонад васвасаи илова кардани усули барои онҳо мувофиқ бошад. Усулро ба схемаи json ва инчунин ба синфи тавлидшуда илова кардан мумкин нест.

Шояд ҳамааш ҳамин бошад.

Хулоса:

Ман кӯшиш кардам, ки бигӯям, ки схемаҳои json формати хеле хуб барои ҳамкорӣ байни лоиҳаҳо мебошанд. Рӯзе ман бо ӯ дар як лоиҳа вохӯрдам ва ӯ ба дилам афтод. Ман онҳоро қариб дар ҳама ҷо истифода мебарам. Бале, ин на ҳамеша қулай аст, зеро барои дидани манбаъҳо, шумо бояд лоиҳаро ҷамъ кунед. Аммо ин pojo аст, ки маънои онро дорад, ки дар он ҷо мантиқ вуҷуд дошта наметавонад ва бо схемаҳо вуҷуд нахоҳад дошт. PS .. баъзан ман суст шарҳ медиҳам, аз ин рӯ ин ҷо як видео бо гузориши хуб аст: Кирилл Меркушев - Насли code ҳамчун роҳи ҳалли мушкилоти автоматизатсия.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION