JavaRush /Blog Java /Random-MS /Skim Json: mengapa dan siapa yang memerlukannya

Skim Json: mengapa dan siapa yang memerlukannya

Diterbitkan dalam kumpulan
Hello, pengembara. Hari ini saya ingin memberitahu anda tentang sedikit sihir. Anda mungkin pernah mendengar tentang json. Ini adalah bahasa universal: ia difahami oleh mesin dan mudah dibaca oleh manusia. Berikut ialah contoh biasa mesej json:
{
   "помещение":{
      "название":"избушка",
      "разумна":true
   },
   "основание":{
      "тип":"курьи ноги",
      "количество":2
   },
   "проживающие":[
      {
         "Name":"Баба Яга",
         "профиль":"ведьма"
      }
   ],
   "местоположение":{
      "address":"граница леса"
   }
}
Mudah untuk berkomunikasi seperti itu, bukan? Jika anda tidak tahu apa itu json sebelum ini, kini anda tahu. Bagaimana untuk menggunakan ini dalam kod java? Json telah menjadi format universal. Ia bermaksud Notasi Objek JavaScript, tetapi telah lama melampaui javascript dan digunakan hampir di mana-mana. Java mempunyai beberapa perpustakaan yang memudahkan kerja dengan json. Berikut adalah yang paling terkenal: Saya akan menggunakan yang kedua. Terdapat 2 versi : codehaus dan fasterxml , saya tidak perasan apa-apa perbezaan padanya, jadi anda boleh menggunakan mana-mana satu di sini. Berikut ialah sekeping kod:
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue("сюда json", "сюда класс");
akan membantu menterjemah json ke dalam objek. Dan kami menghampiri perkara yang paling penting. Menulis kelas untuk json ini. Anda boleh melakukan ini secara manual, buat struktur seperti ini:
-----------------------------------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;

}
Saya secara khusus mengabaikan getter, setter, constructor dan atribut pojo lain, jika tidak, anda akan bosan dengan pembaziran =) Sekarang lihat di sini:
{
  "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
}
Ini ialah rajah json bagi struktur di atas. Kini tiba masanya untuk menerangkan mengapa anda memerlukannya. Ia akan menghapuskan keperluan untuk menulis kelas dan mengekalkannya. Terdapat projek yang begitu baik jsonschema2pojo . Ia menawarkan pemalam untuk pembina projek (Maven, Gradle) yang akan menulis kelas ini untuk anda pada masa pembinaan. Berikut ialah contoh daripada projek saya:
<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>
Ini adalah tetapannya. Perkara yang paling menarik ialah di sini:
<useCommonsLang3>true</useCommonsLang3>
<includeConstructors>true</includeConstructors>
<generateBuilders>true</generateBuilders>
<includeToString>true</includeToString>
<usePrimitives>true</usePrimitives>
Ini ialah arahan tentang cara menulis kelas: useCommonsLang3 - gunakan perpustakaan CommonsLang3 includeConstructors - akan menulis pembina generateBuilders - akan membina pembina corak includeToString - tambahkan keString usePrimitives - arahan untuk menggunakan primitif Bagaimana ini lebih baik daripada kod yang ditulis di rumah ?
  1. Anda boleh menyesuaikan kelas dengan satu baris. Sebagai contoh, anda perlu menambah akhiran Pojo pada setiap kelas. Cuma tambah <classNameSuffix>Pojo</classNameSuffix> untuk memasang projek - dan anda sudah selesai. Jika tidak, kami perlu menukar nama setiap kelas secara manual.

    Terdapat banyak parameter ini, ia patut dibaca tentang semuanya dalam dokumen

  2. Jika projek anda mempunyai pengguna, lebih mudah untuk memberikannya skema json daripada kelas java. Seperti yang telah saya katakan, skim ini adalah universal dan pengguna hanya akan menjana pojo dalam bahasanya sendiri.

  3. Mereka jauh lebih kecil. Contoh di atas mengandungi banyak maklumat yang tidak selalu diperlukan, contohnya, corak dan contoh. Tetapi jika anda mengembalikannya ke kod java, ia juga akan berkembang dengan banyak. Dan jangan lupa tentang kod templat, yang ditunjukkan dalam rajah oleh beberapa tetapan dalam pemalam, tetapi anda perlu menulisnya dalam kod itu sendiri. Dan ya, saya tahu tentang Lombok, ada alternatif.

  4. Tiada logik dalam pojo. Apabila kelas anda ditulis sendiri, seseorang mungkin tergoda untuk menambah kaedah yang sesuai untuk mereka. Kaedah ini tidak boleh ditambahkan pada skema json dan juga pada kelas yang dijana.

Itu sahaja mungkin.

Kesimpulan:

Saya cuba menyampaikan bahawa skema json adalah format yang sangat baik untuk interaksi antara projek. Suatu hari saya bertemu dengannya dalam satu projek, dan dia jatuh ke dalam hati saya. Saya menggunakannya hampir di mana-mana. Ya, ini tidak selalunya mudah, kerana untuk melihat sumber, anda perlu memasang projek itu. Tetapi ini adalah pojo, yang bermaksud tidak ada logik di sana, dan tidak akan ada apa-apa dengan litar. PS.. kadangkala saya menerangkan dengan kurang baik, jadi inilah video dengan laporan yang baik: Kirill Merkushev - Penjanaan kod sebagai cara untuk menyelesaikan masalah automasi.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION