"Merhaba, Amigo!"

"Merhaba Ellie!"

"JSON ile zaten tanıştığınıza göre, bugün bunun hakkında daha fazla konuşalım."

"Tamam. Genellikle nerede kullanılır?"

"Genellikle şöyle çalışır. Birisi (istemci) bir Java programından (sunucu) veri ister. Program, Java nesneleri oluşturur ve onları veritabanındaki bilgilerle doldurur. ) JSON gibi anlayabilir ve onları geri gönderir."

"Size Java'da JSON ile nasıl çalışılacağını anlatayım. Temel olarak, yalnızca iki şey yapmamız gerekiyor: Java nesnelerini JSON biçiminde serileştirmek ve Java nesnelerini JSON biçiminde seri durumdan çıkarmak."

"Başka bir deyişle, JSON bir programdan diğerine mesaj/veri göndermek için bir standarttır. Bunun gibi pek çok standart vardır. Ancak program JavaScript ile yazılmışsa, genellikle JSON'u kullanmaya çalışır."

"Tamam, hazırım."

"Harika. O zaman başlayalım."

JSON'a serileştirme - 1

"Bildiğiniz gibi, Java yerleşik standart serileştirme araçlarına sahiptir. Ancak bunlar JSON'u desteklemez. Bu nedenle, bir nesneyi JSON'a seri hale getirmeniz gerekirse, nasıl yapılacağını bilen popüler çerçevelerden (kütüphaneler) birini kullanabilirsiniz. Bunu yap."

"Bu farklı çerçeveler arasındaki fark nedir?"

"Genellikle karmaşıklık düzeyleri bakımından farklılık gösterirler: Yalnızca en temelleri yapabilen çerçeveler vardır, ancak bunlar çok küçük ve basittir. Ve çok daha fazlasını yapabilen büyük, karmaşık çerçeveler vardır."

"Jackson en popüler çerçevelerden biridir. JSON ile nasıl çalışacağımıza bakarken onu örnek olarak kullanacağız."

"Öncelikle bu çerçeveyi indirmeniz ve projenize eklemeniz gerekiyor. Bunu doğrudan IntelliJ IDEA'da yapmanız gerekiyor. Çerçeveyi bu bağlantıyı kullanarak indirebilirsiniz ."

"Tamamlamak."

"Harika. O zaman devam edelim."

"Bir Java nesnesini JSON'a dönüştürmek, onu seri hale getirmek kadar kolaydır. Bunu yapmak için özel bir ObjectMapper sınıfı vardır (com.fasterxml.jackson.databind.ObjectMapper)."

"Size çalışan bir örnek göstereyim, sonra onu analiz ederiz:"

Bir nesneyi JSON'a dönüştür"
public static void main(String[] args) throws IOException
{
 // Create an object to be serialized into JSON
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // This is the Jackson object that performs the serialization
 ObjectMapper mapper = new ObjectMapper();

 // And here's the serialization itself: the first argument is where, and the second is what
 mapper.writeValue(writer, cat);

 // Convert everything written to the StringWriter into a String
 String result = writer.toString();
 System.out.println(result);
}
Nesneleri JSON'a dönüşen bir Cat sınıfı
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Serileştirme sonucu ve ekran çıktısı:
{"name":"Missy", "age":5, "weight":4}

"Şu şekilde çalışır:"

"4-7. satırlarda, bir Cat nesnesi oluşturuyoruz ve onu verilerle dolduruyoruz."

"10. satırda, nesnenin JSON-dize temsilini yazacağımız bir Writer nesnesi oluşturuyoruz."

"13. satırda, tüm serileştirmeyi gerçekleştirecek bir ObjectMapper nesnesi oluşturuyoruz ."

"16. satırda, cat nesnesinin JSON temsilini write yazarız ."

"19-20 satırlarında sonucu ekranda gösteriyoruz."

"Her şey oldukça basit görünüyor. Java'da yerel serileştirmeden daha zor değil."

"Serileştirme nasıl görünürdü?"

"Neredeyse aynı, sadece daha kısa:"

JSON'dan bir nesneyi dönüştürme
public static void main(String[] args) throws IOException
{
 String jsonString = "{ \"name\":\"Missy\", \"age\":5, \"weight\":4}";
 StringReader reader = new StringReader(jsonString);

 ObjectMapper mapper = new ObjectMapper();

 Cat cat = mapper.readValue(reader, Cat.class);
}
Nesneleri JSON biçiminden seri hale getirilmiş bir sınıf
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"Daha da kolay. ObjectMapper'ı alıp bir string veya JSON ile bir StringReader'ı ve ayrıca seriden çıkarılacak nesnenin sınıfını iletiyoruz. Ardından readValue yöntemini çağırıyoruz ve çıktı olarak hazır bir Java nesnesi alıyoruz. tüm veriler."

"Eh, bu tam olarak Java'daki seri durumdan çıkarma gibi."

"Neredeyse. JSON'da seri hale getirilen veya JSON'dan seri hale getirilen nesneler için getirilen birkaç gereksinim vardır:"

" 1)  alanlar görünür olmalıdır: ya genel olmalı ya da alıcıları ve ayarlayıcıları olmalıdır"

" 2)  varsayılan bir oluşturucu olmalıdır (parametresiz biri)"

"Anlıyorum. Bu çok şaşırtıcı değil. Ama Java her şeyi seri hale getirdi, özel alanları bile."

"Eh, o Java'ydı. Gizli verilere erişimi var. Kendinizden saklanamazsınız."

"Burada üçüncü bir husus daha var. Umarım Cat sınıfındaki @JsonAutoDetect ek açıklamasını fark etmişsinizdir?"

"Evet. Ben de tam ne olduğunu sormak üzereydim."

"Bu bir ek açıklama: Jackson çerçevesi için temizlik bilgileri. Doğru ek açıklamaları kullanarak, JSON'a seri hale getirmenin sonuçları üzerinde oldukça fazla esnek kontrole sahip olursunuz."

"Harika! Ne tür ek açıklamalar var?"

"İşte birkaç örnek:"

Dipnot Tanım
@JsonAutoDetect Bir sınıfın önüne yerleştirildi.
Bir sınıfı JSON'a seri hale getirilmeye hazır olarak işaretler.
@JsonIgnore Bir mülkün önüne yerleştirilir.
Özellik, serileştirme sırasında yok sayılır.
@JsonProperty Bir özelliğin veya bir alıcının veya ayarlayıcının önüne yerleştirilir. Serileştirme sırasında farklı bir alan adı belirlemenizi sağlar.
@JsonWriteNullProperties Bir sınıfın önüne yerleştirildi.
Boş olan nesne alanları yoksayılmaz.
@JsonPropertyOrder Bir sınıfın önüne yerleştirildi.
Serileştirme sırasında alan sırasını belirlemenizi sağlar.

"Ne kadar ilginç! Daha var mı?"

"Çok var. Ama şimdi onlara değinmeyeceğiz. Şimdi ilk örneğimizi biraz yeniden çalışalım:"

Bir nesneyi JSON'a dönüştürme
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 StringWriter writer = new StringWriter();

 ObjectMapper mapper = new ObjectMapper();

 mapper.writeValue(writer, cat);

 String result = writer.toString();
 System.out.println(result);
}
Nesneleri JSON'a dönüşen bir sınıf
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Serileştirme sonucu ve ekran çıktısı:
{"age":5, "alias":"Missy"}

"Kod aynı kalıyor, ancak ek açıklamaları değiştirdim: Ad alanı için başka bir ad belirledim: alias. Ağırlık alanını Yoksay olarak işaretledim, bu da JSON nesnesinin değişmesine neden oldu."

"Her şeyi bu şekilde özelleştirebilmen iyi. Bunu kesinlikle faydalı bulacağımı düşünüyorum."

"Ve seri durumdan çıkarma bununla nasıl çalışılacağını anlayacaktır? JSON'dan bir Java nesnesine seri durumdan çıkarma yapılırken, takma ad alanının değeri Cat nesnesinin ad alanına mı yazılacak?"

"Evet, seri kaldırma olması gerektiği gibi çalışacak. Akıllıca."

"O zaman sevinmeyecek ne var?"

"Bu ilginç ders için teşekkürler, Ellie."