{
"помещение":{
"название":"избушка",
"разумна":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қа қарағанда қаншалықты жақсы? ?
-
Бір жолмен сыныптарды теңшеуге болады. Мысалы, әр сыныпқа Pojo жұрнағын қосу керек. Жобаны құрастыру үшін жай ғана <classNameSuffix>Pojo</classNameSuffix> қосыңыз - және сіз аяқтадыңыз. Әйтпесе, әр сыныптың атын қолмен өзгертуге тура келеді.
Бұл параметрлер өте көп, олардың барлығы туралы құжаттардан оқыған жөн
-
Егер сіздің жобаңызда тұтынушы болса, оған java сыныптарынан гөрі json схемаларын беру оңайырақ болады. Жоғарыда айтқанымдай, схемалар әмбебап және тұтынушы жай ғана өз тілінде пожо жасайды.
-
Олар әлдеқайда аз. Жоғарыдағы мысалда әрқашан қажет емес көптеген ақпарат бар, мысалы, үлгілер мен мысалдар. Бірақ егер сіз оларды java codeына қайтарсаңыз, ол да көп өседі. Плагиндегі бірнеше параметрлермен диаграммаларда көрсетілген үлгі codeы туралы ұмытпаңыз, бірақ оны codeқа өзіңіз жазуыңыз керек. Иә, мен Ломбок туралы білемін, балама бар.
-
Поджода логика жоқ. Сіздің сабақтарыңыз өздігінен жазылған кезде, біреу оларға ыңғайлы әдісті қосуға азғырылуы мүмкін. Әдісті json схемасына, сондай-ақ жасалған сыныпқа қосу мүмкін емес.
GO TO FULL VERSION