JDK daxilində JSON API
Java 28 | JEP 540 | Sadə JSON API (inkubator mərhələsi)
Java proqramçıları illərdir JSON ilə işləmək üçün Jackson və Gson kimi kənar kitabxanalardan istifadə edirlər.
REST API hazırlayanda, kənar servislərə müraciət edəndə, konfiqurasiya fayllarını oxuyanda və ya Kafka hadisələrini emal edəndə JSON ilə qarşılaşırıq.
Amma Java Development Kit-in özündə həmişə bir imkan çatışmayıb: JSON mətnini oxumaq və JSON yaratmaq üçün sadə, daxili API.
JEP 540: Simple JSON API (Incubator) ilə Java 28 bu boşluğu aradan qaldırmaq istiqamətində mühüm addım atır.
İlk dəfə proqramçılar Jackson, Gson və ya başqa JSON kitabxanası əlavə etmədən, birbaşa JDK-nın təqdim etdiyi xüsusi API ilə əsas JSON əməliyyatlarını yerinə yetirə biləcəklər.
Bəs bu, Jackson-un artıq lazım olmayacağı deməkdir?
Tam olaraq yox.
JEP 540-ın nə təqdim etdiyinə, necə işlədiyinə və müasir backend tətbiqlərində hansı yeri tutduğuna baxaq.
Buraxılış vəziyyəti: JEP 540, buraxılışı 2027-ci ilin martına planlaşdırılan JDK 28-ə inteqrasiya edilib. 2 noyabr 2026-cı il tarixinə Java 28 hələ ümumi istifadəyə buraxılmayıb. API inkubator mərhələsindədir, buna görə daimi API-yə çevrilənədək dizaynı dəyişə bilər.
Java-ya daxili JSON API niyə lazımdır?
Təsəvvür edin ki, kənar API-yə müraciət edən kiçik Java tətbiqi hazırlayırsınız.
Cavab belədir:
{
"service": "payment-service",
"status": "healthy",
"instances": 4,
"metrics": {
"latencyMs": 25,
"errorRate": 0.01
}
}
Tətbiqinizə yalnız servisin adını, vəziyyətini və gecikmə müddətini oxumaq lazımdır.
Adətən bunun üçün layihəyə kənar JSON kitabxanası əlavə edərdiniz.
Məsələn, Jackson ilə:
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(response);
String service = root.get("service").asText();
int latency = root
.get("metrics")
.get("latencyMs")
.asInt();
Kod sadədir, amma yenə də JDK-dan kənar kitabxana tələb edir.
Böyük Spring Boot tətbiqlərində bu, nadir hallarda problem yaradır. Jackson artıq freymvorkla sıx inteqrasiya olunub.
Amma daha kiçik tətbiqləri nəzərdən keçirək:
- Əmr sətri alətləri
- Yüngül HTTP klientləri
- Proqramçılar üçün daxili köməkçi alətlər
- Sadə konfiqurasiya emalçıları
- Diaqnostika və monitorinq alətləri
- Kiçik, müstəqil Java servisləri
Belə hallarda geniş imkanlı JSON freymvorku əlavə etməyə ehtiyac olmaya bilər.
JEP 540-ın məqsədi bütün JSON kitabxanalarını əvəz etmək deyil. Məqsəd əsas JSON əməliyyatlarını Java-nın standart imkanına çevirməkdir.
JEP 540 nədir?
JEP 540 JSON sənədlərini oxumaq, onların strukturunda hərəkət etmək və yeni sənədlər yaratmaq üçün yüngül API təqdim edir.
API inkubator modulu vasitəsilə verilir:
jdk.incubator.json
Onun dizaynı JSON standartını müəyyən edən RFC 8259 spesifikasiyasına əsaslanır.
Təklif beş əsas imkanı əhatə edir:
- JSON mətnini yaddaşda saxlanan struktura çevirmək.
- JSON obyektləri və massivləri daxilində hərəkət etmək.
- Tipə uyğun metodlarla dəyərləri əldə etmək.
- Proqram vasitəsilə JSON sənədləri qurmaq.
- JSON dəyərlərini yenidən mətnə serializasiya etmək.
Java obyektlərinə avtomatik çevirmə, JSON-un axın şəklində emalı və sxem yoxlaması kimi bəzi geniş imkanlar API-nin əhatə dairəsinə qəsdən daxil edilməyib.
Bu fərqi nəzərə almaq vacibdir.
JEP 540 JSON sənədləri ilə işləmək üçün API-dir, obyektlərin serializasiyası üçün tam funksional freymvork deyil.
İnkubator nə deməkdir?
Java bəzi eksperimental API-ləri inkubator modulları vasitəsilə təqdim edir.
İnkubator mərhələsindəki API-ni proqramçılar sınaqdan keçirə bilərlər, amma o, hələ Java SE-nin daimi API-si sayılmır.
Bu mərhələdə:
- Açıq API-lər dəyişə bilər.
- Proqramçılar rəy bildirə bilərlər.
- Uyğunluğu pozan dəyişikliklər mümkündür.
- Modul sonradan standartlaşdırıla və ya silinə bilər.
Canlı sistemlərlə işləyən komandalar bunu yekunlaşmış, uzunmüddətli müqavilə kimi qəbul etməməli, API-ni diqqətlə qiymətləndirməlidirlər.
JSON dəyər modeli necə qurulub?
Yeni API-nin mərkəzində JsonValue interfeysi dayanır.
Bu interfeys JSON sənədindəki bir dəyəri təmsil edir.
JSON altı əsas dəyər kateqoriyasını dəstəkləyir. Hər kateqoriyaya uyğun Java interfeysi var.
| JSON tipi | Java API-si |
|---|---|
| Obyekt | JsonObject |
| Massiv | JsonArray |
| Sətir | JsonString |
| Ədəd | JsonNumber |
| Məntiqi dəyər | JsonBoolean |
| Null | JsonNull |
Bu interfeyslər kökündə JsonValue dayanan tip iyerarxiyası yaradır.
Ümumi quruluş belədir:
JsonValue
+-- JsonObject
+-- JsonArray
+-- JsonString
+-- JsonNumber
+-- JsonBoolean
+-- JsonNull
JsonValue sealed interfeysdir, onun icazə verdiyi dəyər interfeysləri isə non-sealed olaraq təyin edilib.
Beləliklə, JSON kateqoriyalarının dəqiq siyahısı müəyyən olunur, eyni zamanda həmin interfeyslərin implementasiyalarını yaratmaq mümkün qalır.
Bu nə üçün faydalıdır?
API bütün dəyərləri ümumi Java Object tipi kimi qəbul etmək əvəzinə, JSON dəyərlərini öz tipləri ilə təmsil edir.
Məsələn, JSON ədədi avtomatik Integer və ya Double kimi deyil, JsonNumber kimi təqdim olunur.
Bu yanaşma JSON tipləri ilə Java tipləri arasındakı fərqi daha aydın göstərir.
Həmçinin Java-nın müasir pattern matching imkanları ilə rahat işləyir.
4. Java 28-də JSON mətninin oxunması
Praktik nümunə ilə başlayaq.
Fərz edək ki, kənar servis bu cavabı qaytarır:
{
"user": {
"id": 101,
"name": "Alice",
"active": true
}
}
Təklif olunan API ilə:
import jdk.incubator.json.Json;
import jdk.incubator.json.JsonValue;
String response = """
{
"user": {
"id": 101,
"name": "Alice",
"active": true
}
}
""";
JsonValue root = Json.parse(response);
int id = root
.get("user")
.get("id")
.asInt();
String name = root
.get("user")
.get("name")
.asString();
boolean active = root
.get("user")
.get("active")
.asBoolean();
Burada diqqətəlayiq bir məqam var.
Aralıq obyektlərin hər birini əl ilə JsonObject tipinə çevirməyə ehtiyac yoxdur.
API birbaşa JsonValue üzərindən metodları zəncirvari çağıraraq strukturda hərəkət etməyə imkan verir.
Bu, API-nin ən faydalı dizayn qərarlarından biridir.
İç-içə JSON strukturlarında hərəkət
Daha mürəkkəb cavaba baxaq:
{
"order": {
"id": "ORD-2028",
"customer": {
"name": "Alice"
},
"items": [
{
"product": "Laptop",
"quantity": 2
},
{
"product": "Mouse",
"quantity": 1
}
]
}
}
İlk məhsulu oxuyaq:
String product = Json.parse(response)
.get("order")
.get("items")
.get(0)
.get("product")
.asString();
Nəticə:
Laptop
API həm obyektin sahəsinə, həm də massiv elementinə indekslə müraciəti dəstəkləyir.
get(String)obyektin sahəsinə müraciət edir.get(int)massiv elementinə müraciət edir.asString()sətir dəyərini qaytarır.asInt()tam ədəd dəyərini qaytarır.asBoolean()məntiqi dəyəri qaytarır.
Bu, xüsusilə kənar servislərin cavablarını yoxlayarkən rahatdır.
5. Mövcud olmayan sahələr və null dəyərləri
Praktikada JSON sənədləri nadir hallarda qüsursuz olur.
Bəzi sahələr mövcud olmaya, məcburi olmaya və ya açıq şəkildə null dəyəri daşıya bilər.
Bu nümunəyə baxaq:
{
"username": "alice",
"email": null
}
Burada iki fərqli vəziyyət var:
A vəziyyəti: Sahə mövcud deyil.
{
"username": "alice"
}
B vəziyyəti: Sahə mövcuddur, amma dəyəri null-dur.
{
"username": "alice",
"email": null
}
API müqavilələrində bu vəziyyətlər fərqli mənalar daşıya bilər.
JEP 540 onları ayırd etmək üçün metodlar təqdim edir.
JsonValue root = Json.parse(response);
Optional<JsonValue> email =
root.tryGet("email");
Obyektin sahəsi mövcud olmayanda tryGet() boş Optional qaytarır.
Sahə mövcuddursa və JSON null dəyərini saxlayırsa, qaytarılan Optional daxilində JsonNull dəyəri olur.
API JSON null dəyərini boş Optional kimi təqdim etmək üçün tryValue() metodunu da verir.
Bu, məcburi olmayan JSON sahələri üzərində proqramçıya daha çox nəzarət imkanı yaradır.
Canlı sistemlərdə nəzərə alınmalı məqam
Hər JSON sahəsinin mövcud olduğunu və gözlənilən tipdə olduğunu fərz etməyin.
Kənar API cavablarını emal edərkən məcburi sahələri yoxlayın, məcburi olmayan sahələrin necə işlənəcəyini isə açıq şəkildə müəyyən edin.
Yanlış və ya gözlənilməz quruluşlu cavab səbəbi bilinməyən nasazlıq əvəzinə, tətbiqin idarə edə bildiyi xəta ilə nəticələnməlidir.
6. Kənar kitabxana olmadan JSON yaratmaq
JSON mətnini oxumaq işin yalnız bir hissəsidir.
Tətbiqlərə JSON yaratmaq da lazımdır.
Məsələn, bu sənədi yaratmaq istəyirik:
{
"service": "notification-service",
"instances": 3,
"healthy": true
}
JEP 540 ilə:
import jdk.incubator.json.JsonObject;
import jdk.incubator.json.JsonString;
import jdk.incubator.json.JsonNumber;
import jdk.incubator.json.JsonBoolean;
import java.util.Map;
JsonObject document = JsonObject.of(
Map.of(
"service",
JsonString.of("notification-service"),
"instances",
JsonNumber.of(3),
"healthy",
JsonBoolean.of(true)
)
);
String json = document.toString();
Alınan JSON eyni obyekti təmsil edir.
Vacib məqam budur ki, hər Java dəyəri uyğun JSON fabrik metodu ilə çevrilməlidir.
Məsələn:
JsonString.of("hello");
JsonNumber.of(42);
JsonBoolean.of(true);
Beləliklə, JSON tipi açıq şəkildə göstərilir.
Bununla yanaşı, böyük sənədlər qurarkən bəzi mövcud JSON kitabxanalarına nisbətən daha çox kod yazmaq lazım gələ bilər.
Yığcam və formatlanmış JSON
Bu çağırış:
document.toString();
yığcam JSON yaradır.
Rahat oxunan çıxış üçün API bu metodu təqdim edir:
Json.toDisplayString(document, " ");
Formatlanmış çıxış JSON-u diaqnostika alətlərində və proqramçılar üçün köməkçi alətlərdə göstərərkən xüsusilə faydalıdır.
7. JSON və pattern matching: müasir Java yanaşması
JSON dəyər iyerarxiyasının maraqlı üstünlüklərindən biri Java-nın pattern matching imkanları ilə uyğunluğudur.
Təsəvvür edin ki, kənar API identifikatoru bəzən ədəd, bəzən isə sətir kimi qaytarır.
A nümunəsi:
{
"id": 12345
}
B nümunəsi:
{
"id": "12345"
}
Pattern matching dəstəkləyən switch ilə hər iki formanı emal edə bilərik:
JsonValue value = Json.parse(response)
.get("id");
long id = switch (value) {
case JsonNumber number ->
number.asLong();
case JsonString string ->
Long.parseLong(string.asString());
default ->
throw new IllegalArgumentException(
"Unsupported ID format"
);
};
Bu yanaşmanın bir neçə üstünlüyü var:
- Hər tip üçün davranış açıq göstərilir
- Çevirmə məntiqi rahat oxunur
- Digər hallarda nə baş verəcəyi aydındır
- Müasir Java dil imkanları ilə uyğun işləyir
Nümunədə identifikatorun icazə verilən iki təqdimat forması emal olunur.
Canlı sistemdə tətbiq yenə də identifikatorun qiymət aralığını və gözlənilən formatını yoxlamalıdır.
8. Dəyişməzlik və çoxaxınlı mühitdə təhlükəsizlik
Digər mühüm dizayn qərarı JSON dəyərlərinin dəyişməz olmasıdır.
JSON sənədi oxunduqdan və ya qurulduqdan sonra onun dəyərlərini yerində dəyişmək mümkün deyil.
Məsələn, oxunmuş obyektin status sahəsini setter vasitəsilə birbaşa dəyişə bilməzsiniz.
Bunun əhəmiyyəti nədir?
Bir neçə icra axınının eyni JSON konfiqurasiyasını oxuduğu backend servisini təsəvvür edin.
Struktur dəyişməz olduqda onu oxuyanlar ortaq sənədi təsadüfən dəyişə bilmirlər.
Bu, JSON dəyərlərinin özünü qorumaq üçün əlavə surət yaratmağa və sinxronizasiyaya ehtiyacı azaldır.
Praktik nümunə
Servis konfiqurasiya sənədini bir dəfə oxuyub onun dəyişməz strukturunu bir neçə oxucu arasında təhlükəsiz şəkildə paylaşa bilər.
Amma dəyişməzlik tətbiqdəki bütün əməliyyatları avtomatik olaraq çoxaxınlı mühitdə təhlükəsiz etmir.
Tətbiq ortaq konfiqurasiyaya istinadı dinamik şəkildə yeniləyirsə, yeni istinadın digər axınlara görünməsi və əməliyyatların əlaqələndirilməsi üçün yenə də uyğun paralel icra mexanizmləri lazımdır.
Verilən əsas təminat budur: JSON dəyərlərinin öz strukturu dəyişməzdir və çoxaxınlı mühitdə təhlükəsizdir.
9. Ciddi JSON sintaksisi və xətaların idarə edilməsi
JEP 540 JSON sintaksis qaydalarına ciddi əməl edir.
Bu sənədə baxaq:
{
"name": "Alice",
"active": true,
}
Burada son elementdən sonra vergül var.
Daha yumşaq qaydalarla işləyən bəzi parserlər bunu qəbul edə bilər.
JDK-nın Simple JSON API-si isə rədd edir.
Eyni qayda şərhlərə və RFC 8259-un dəstəkləmədiyi digər sintaksis genişləndirmələrinə də aiddir.
Təkrarlanan JSON açarları
Bu nümunəyə baxaq:
{
"role": "USER",
"role": "ADMIN"
}
Müxtəlif JSON parserləri təkrarlanan açarları fərqli emal edə bilər.
Bəziləri ilk dəyəri, digərləri sonuncu dəyəri saxlayır.
JEP 540 obyekt daxilində təkrarlanan sahə adlarını rədd edir.
Bu qərar sistemlərarası uyğunluq və düzgünlük baxımından faydalıdır.
JSON oxunarkən yaranan xətaların idarə edilməsi
try {
JsonValue document = Json.parse(response);
// Process the document
} catch (JsonParseException exception) {
// Handle invalid JSON syntax
}
Təklif olunan istisna API-si oxuma əməliyyatının harada uğursuz olduğunu bildirir.
Dəyərlərə yanlış müraciətlər və çevirmələr üçün ayrıca JsonValueException istifadə olunur.
Məsələn, JSON sətirinə massiv indeksi ilə müraciət etmək düzgün əməliyyat deyil.
Təhlükəsizlik baxımından nəzərə alınmalı məqamlar
Sintaksisin ciddi yoxlanması bəzi qeyri-müəyyənlikləri aradan qaldırır, amma daxil olan məlumatın yoxlanmasını əvəz etmir.
Tətbiqlər yenə də bunları nəzərə almalıdır:
- Sorğunun maksimum ölçüsü
- Yaddaş sərfiyyatı
- Həddindən artıq iç-içə strukturlu sənədlər
- Gözlənilməyən məlumat tipləri
- Ədədlərin qiymət aralıqları
- Tətbiqə xas yoxlamalar
Parserin sintaktik baxımdan düzgün JSON-u qəbul etməsi sənədin tətbiqinizin iş qaydaları üçün təhlükəsiz və ya keçərli olduğu demək deyil.
10. Java 28 JSON API, Jackson və Gson müqayisəsi
Backend mühəndisləri üçün əsas suallardan biri budur.
Yeni API mövcud kitabxanalarla müqayisədə nə təklif edir?
| İmkan | JEP 540 | Jackson | Gson |
|---|---|---|---|
| JSON mətnini oxumaq | Bəli | Bəli | Bəli |
| JSON yaratmaq | Bəli | Bəli | Bəli |
| JSON ağacında hərəkət etmək | Bəli | Bəli | Bəli |
| Kənar asılılıq | Kənar kitabxana tələb etmir | Tələb olunur | Tələb olunur |
| Java obyektlərinə çevirmə | Xeyr | Bəli | Bəli |
| JSON-un axın şəklində emalı | Xeyr | Bəli | Bəli |
| Geniş fərdiləşdirmə imkanları | Məhdud | Geniş | Mövcuddur |
| API-nin yetkinliyi | İnkubator mərhələsi | Yetkin | Yetkin |
JDK API-sinin əhatə dairəsi qəsdən daha kiçik saxlanılıb.
Obyektlərə çevirmə, axın şəklində emal, fərdiləşdirmə və freymvork inteqrasiyaları sayəsində Jackson korporativ tətbiqlər üçün xüsusilə faydalı olaraq qalır.
Məsələn:
record User(
long id,
String name,
boolean active
) {}
Jackson ilə:
User user = objectMapper.readValue(
response,
User.class
);
Bu kod JSON sənədini avtomatik olaraq Java record-una çevirir.
JEP 540 obyektlərə belə avtomatik çevirmə imkanı təqdim etmir.
Bunun əvəzinə proqramçı sahələri əl ilə oxumalı və record-u özü yaratmalıdır.
JsonValue json = Json.parse(response);
User user = new User(
json.get("id").asLong(),
json.get("name").asString(),
json.get("active").asBoolean()
);
Sadə sənədlər üçün sahələri əl ilə oxumaq tamamilə məqbul ola bilər.
Mürəkkəb domen modellərində isə Jackson adətən daha rahatdır.
Spring Boot-a hələ də Jackson lazımdır?
Tipik Spring Boot tətbiqlərində Jackson və ya dəstəklənən başqa JSON serializasiya həlli aktuallığını qoruyacaq.
REST kontrollerinə baxaq:
@RestController
@RequestMapping("/api/users")
class UserController {
@GetMapping("/{id}")
UserResponse findUser(@PathVariable long id) {
return new UserResponse(
id,
"Alice",
true
);
}
}
Spring-in HTTP mesajlarını çevirmə infrastrukturu konfiqurasiya edilmiş JSON inteqrasiyası vasitəsilə cavabı serializasiya edir.
JEP 540 freymvork səviyyəsindəki bu funksiyanı avtomatik əvəz etmir.
Daxili JSON API və tam funksional serializasiya freymvorkunun həll etdiyi problemlər qismən üst-üstə düşsə də, fərqlidir.
11. Backend mühəndisləri üçün praktik istifadə halları
JEP 540-ın harada faydalı ola biləcəyinə baxaq.
Nümunə 1: Servisin sağlamlıq yoxlamasının cavabını oxumaq
Fərz edək ki, servis bu sorğunu göndərir:
GET /actuator/health
Cavab:
{
"status": "UP"
}
Tətbiqə yalnız bir dəyər lazımdır.
String status = Json.parse(response)
.get("status")
.asString();
Bu əməliyyat üçün tam funksional obyektə çevirmə freymvorkuna ehtiyac olmaya bilər.
Nümunə 2: Kənar REST API-nin cavabını yoxlamaq
Təsəvvür edin ki, servis hava proqnozu API-sinə müraciət edir və ona yalnız cari temperatur lazımdır.
int temperature = Json.parse(response)
.get("properties")
.get("periods")
.get(0)
.get("temperature")
.asInt();
Nümunə iç-içə JSON strukturunda hərəkət etmək üçün nə qədər az kodun kifayət etdiyini göstərir.
Nümunə 3: Konfiqurasiya sənədlərini emal etmək
Əmr sətri aləti bu sənədi oxuyur:
{
"environment": "production",
"retry": {
"maxAttempts": 5
}
}
Konfiqurasiya dəyərlərini əldə edək:
JsonValue config = Json.parse(content);
String environment = config
.get("environment")
.asString();
int maxAttempts = config
.get("retry")
.get("maxAttempts")
.asInt();
Alət bu əməliyyatları kənar JSON kitabxanası əlavə etmədən yerinə yetirə bilər.
Nümunə 4: Kafka hadisələrinin məzmununu yoxlamaq
Bu Kafka hadisəsini təsəvvür edin:
{
"eventType": "PAYMENT_COMPLETED",
"paymentId": "PAY-101",
"amount": 250
}
Yüngül diaqnostika aləti hadisənin tipini yoxlaya bilər:
String eventType = Json.parse(payload)
.get("eventType")
.asString();
Bu yanaşma proqramçı alətləri, xəta araşdırması və kiçik mesajların yoxlanması üçün faydalıdır.
Amma çoxlu hadisə emal edən, yüksək buraxılış qabiliyyətli Kafka istehlakçıları üçün parserin performansını, yaddaş ayırma davranışını, sxemin dəyişməsini və serializasiya tələblərini yenə də qiymətləndirmək lazımdır.
JEP 540-ın mövcud, yetkin kitabxanalardan avtomatik olaraq daha sürətli olduğunu fərz etmək olmaz.
12. Performans: daxili API Jackson-dan sürətlidirmi?
Tez-tez belə bir fikir səslənir:
"JSON emalı JDK-nın daxilindədirsə, mütləq daha sürətli olmalıdır."
Bu fərziyyə doğru deyil.
JDK-nın təqdim etdiyi implementasiya avtomatik olaraq kənar kitabxanadan daha sürətli olmur.
Jackson illərlə optimallaşdırılıb və canlı sistemlərdə istifadə olunub.
Simple JSON API əsas əməliyyatlar üçün yığcam və anlaşılan API təqdim etməyə üstünlük verir.
O, bütün JSON emalı iş yüklərində mövcud həlləri əvəz edən universal, yüksək performanslı vasitə kimi hazırlanmayıb.
Performans testlərində nəyi ölçmək lazımdır?
Mənalı müqayisə üçün bunları ölçün:
- Kiçik və orta ölçülü JSON sənədlərinin oxunmasında buraxılış qabiliyyəti.
- Yaddaş ayırma sürəti və garbage collector üzərindəki yük.
- p50, p95 və p99 persentillərində gecikmə.
- Serializasiyanın buraxılış qabiliyyəti.
- Paralel iş yükləri zamanı yaddaş istifadəsi.
- Dərin iç-içə strukturlar emal edilərkən performans.
Java mikrobençmarkları üçün JMH istifadə edin və hər implementasiyanın eyni işi gördüyünə əmin olun.
Bir dəfə icra olunan testdən və ya System.nanoTime() ilə sadə vaxt müqayisəsindən yekun nəticə çıxarmayın.
JSON alətlərini JDK-ya daxil olub-olmamasına görə deyil, iş yükünüzün ölçmələrlə müəyyən edilmiş tələblərinə görə seçin.
13. API-ni necə sınaqdan keçirmək olar?
JEP 540 inkubator modulu təqdim etdiyinə görə modulun istifadəsini açıq şəkildə göstərmək lazımdır.
Bu imkanı ehtiva edən uyğun JDK 28 erkən sınaq yığımı ilə kompilyasiyanın ümumi forması belədir:
javac \
--add-modules jdk.incubator.json \
JsonExample.java
Tətbiqi başladın:
java \
--add-modules jdk.incubator.json \
JsonExample
Mövcud modulları bu əmrlə yoxlaya bilərsiniz:
java --list-modules
Siyahıda bu modulu axtarın:
jdk.incubator.json
Modul seçilmiş JDK yığımında olmalıdır.
Erkən sınaq API-lərini və onların dəqiq davranışını müvafiq yığımın sənədləşməsi əsasında yoxlamaq lazımdır.
Canlı sistemlər üçün layihə hazırlayarkən nəzərə alın ki, inkubator modulları daimi uyğunluq təminatı vermir.
14. JEP 540 hansı problemləri həll etmir?
Məhdudiyyətləri anlamaq imkanları bilmək qədər vacibdir.
Obyektlərə avtomatik çevirmə yoxdur
Jackson-un readValue() metodunun daxili qarşılığı ilə mürəkkəb JSON sənədini istənilən Java domen obyektinə birbaşa deserializasiya edə bilməzsiniz.
Axın şəklində emal API-si yoxdur
Təklif yaddaşda saxlanan JSON sənədlərinə yönəlib.
O, sənədin strukturunu yaddaşda tam yaratmadan çox böyük JSON sənədlərini hissə-hissə emal etmək üçün nəzərdə tutulmayıb.
JSON Schema yoxlaması yoxdur
API JSON sintaksisini emal edir, amma biznes tələblərini ifadə edən sxemləri yoxlamır.
Məsələn, ödəniş məbləğinin müsbət olmasını və ya müəyyən tətbiq müqaviləsinə əsasən hansısa sahənin məcburi olmasını avtomatik təmin etmir.
Tam freymvork inteqrasiyası yoxdur
API Spring Boot, Hibernate ilə əlaqəli alətlər və digər freymvorklardakı JSON inteqrasiyalarını avtomatik əvəz etmir.
API-nin uzunmüddətli sabitliyinə hələ təminat verilmir
İnkubator mərhələsində olduğu üçün onun açıq API-si dəyişə bilər.
Bunlar mütləq çatışmazlıq sayılmalı deyil. Əhatə dairəsi ilə bağlı məqsədli qərarlardır.
15. Canlı sistemdə istifadə etməyə dəyərmi?
Cavab tətbiqinizin tələblərindən asılıdır.
Bu hallarda JEP 540-ı sınaqdan keçirməyi düşünün:
- Kiçik, müstəqil Java aləti hazırlayırsınız.
- Yalnız əsas JSON oxuma və ya yaratma əməliyyatlarına ehtiyacınız var.
- Kənar asılılıqları azaltmaq istəyirsiniz.
- JSON sənədləriniz çox böyük deyil.
- JDK-nın gələcək imkanlarını qiymətləndirmək istəyirsiniz.
Bu hallarda yetkin kitabxanalardan istifadəni davam etdirin:
- Tətbiqiniz DTO serializasiyasından geniş istifadə edir.
- Spring Boot-un sorğu və cavabları avtomatik çevirmə imkanlarından istifadə edirsiniz.
- Çox böyük JSON axınlarını emal edirsiniz.
- Təkmil annotasiyalara və ya fərdiləşdirməyə ehtiyacınız var.
- Ekosistemlə yetkin inteqrasiyalar tələb olunur.
- Uyğunluq gözləntiləri aydın olan sabit API-lərə ehtiyacınız var.
Kritik canlı tətbiqlərdə təkcə API-nin inkubator mərhələsində olması ehtiyatlı yanaşmaq üçün ciddi səbəbdir.
Daha geniş istifadəyə keçməzdən əvvəl API-ni daxili alətlərdə, eksperimentlərdə və ya təcrid olunmuş komponentlərdə qiymətləndirmək məntiqli yanaşmadır.
16. Daha geniş baxış: bu, Java üçün niyə əhəmiyyətlidir?
JEP 540 Java-nın inkişafında daha geniş bir istiqaməti göstərir.
Platforma uyğunluğu, performansı və kodun uzun müddət rahat saxlanmasını nəzərə alaraq proqramçıların işini asanlaşdırmağa davam edir.
Daxili JSON API gündəlik tapşırıqları, xüsusilə böyük tətbiq freymvorklarından kənarda, asanlaşdıra bilər.
Həmçinin sadə JSON əməliyyatlarına ehtiyac olduqda proqramçıların arxalana biləcəyi ortaq baza yaradır.
Amma standartlaşdırma bütün ixtisaslaşmış kitabxanaların lazımsız olması demək deyil.
Java artıq JDK daxilində şəbəkə, kolleksiyalar, paralel icra və kriptoqrafiya API-ləri təqdim edir.
Tələblər daxili imkanları aşanda proqramçılar yenə də ixtisaslaşmış kitabxana və freymvorklardan istifadə edirlər.
JSON emalı da eyni modelə uyğun inkişaf edə bilər.
Əsas əməliyyatlar üçün kiçik standart API.
Daha mürəkkəb tələblər üçün ixtisaslaşmış kitabxanalar.
Bu, praktik tarazlıqdır.
Yekun fikirlər
Java 28-in Simple JSON API-si Java ekosisteminə əhəmiyyətli əlavədir.
Gündəlik JSON emalı üçün sadə API-ni birbaşa JDK-da təqdim etməklə uzun müddətdir mövcud olan boşluğu doldurur.
Buradan çıxan əsas nəticə Jackson və ya Gson-un yox olacağı deyil.
Əsas məqam budur ki, Java proqramçılarının daha bir seçimi olacaq: əsas JSON oxuma, strukturda hərəkət və sənəd yaratma əməliyyatları üçün kənar JSON kitabxanası tələb etməyən seçim.
Backend mühəndisi üçün bu API-nin harada uyğun olduğunu anlamaq onu sadəcə yeni olduğu üçün istifadə etməkdən daha faydalıdır.
Həll etdiyiniz problemə uyğun alət seçin.
JEP 540-ın inkişafını da izləyin.
Əlavə oxu materialları
- JEP 540: Sadə JSON API (inkubator mərhələsi)
- OpenJDK
- Java 28-in erkən sınaq yığımları
- RFC 8259: JSON məlumat mübadiləsi formatı
Proxy Academy ilə öyrənməyə davam edin
proxy-academy.com saytında Java, backend proqramlaşdırma, sistem dizaynı və canlı sistemlərə uyğun proqram arxitekturasını öyrənin.
Müzakirə: Kiçik servislərdə Java-nın daxili JSON API-sindən istifadə edərdiniz, yoxsa Jackson ilə davam edərdiniz?
