{
"помещение":{
"название":"избушка",
"разумна":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 : codehaus və fasterxml , 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 ?
-
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
-
Ə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.
-
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.
-
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.
GO TO FULL VERSION