Java geliştiricileri, JSON'u ayrıştırma kolaylığı nedeniyle sıklıkla JavaScript'i kıskanmışlardır. Java daha fazla sağlamlık sunmasına rağmen, daha fazla çalışma ve standart kod gerektirme eğilimindedir. Manifold projesi sayesinde Java artık JSON dosyalarını ayrıştırma ve işleme konusunda JavaScript'i gölgede bırakma potansiyeline sahip.
Manifold, JSON'u (ve çok daha fazlasını) işleme biçimimizi tamamen değiştiren, Java için devrim niteliğinde bir dil uzantıları kümesidir.
Bu eğitimin kodunu GitHub sayfamda bulabilirsiniz. Manifold nispeten genç ama yetenekleri zaten çok geniş. Proje hakkında daha fazla bilgiyi web sitelerinden ve Slack kanalından edinebilirsiniz.
Başlamak için şu anda yalnızca JetBrains IDE'lerinde kullanılabilen Manifold eklentisini yüklemeniz gerekir. Proje, en son JDK 19 da dahil olmak üzere Java'nın LTS sürümlerini destekler.
Eklentiyi IntelliJ/IDEAs ayarları kullanıcı arayüzünden pazara gidip Manifold'u arayarak yükleyebiliriz. Eklenti, IDE'nin Maven/Gradle eklentisi tarafından yapılan işle çakışmamasını sağlar.
Manifold, her biri özel bir dil uzantısı sunan birden fazla küçük projeden oluşur. Bugün böyle bir uzantıyı tartışacağız, ancak keşfedilecek daha çok şey var.
Manifold'u göstermek için basit bir Maven projesi kullanacağız (aynı zamanda Gradle ile de çalışır). Öncelikle mevcut Manifold sürümünü web sitelerinden yapıştırmamız ve gerekli bağımlılıkları eklememiz gerekiyor. JSON'un ana bağımlılığı manifold-json-rt
bağımlılığıdır.
YAML, XML ve CSV desteği için başka bağımlılıklar eklenebilir. Bunu projedeki pom.xml
dosyasına eklememiz gerekiyor.
JSON için ortak metin azaltmanın Maven derleme betiğindeki büyük miktarda yapılandırmayla başladığı ironinin farkındayım. Ancak bu "gerçek kod" değil, yapılandırmadır; çoğunlukla kopyala ve yapıştır.
Bu kodu azaltmak istiyorsanız Gradle eşdeğer kodunun kısa olduğuna dikkat edin.
Bu satırın özellikler bölümüne girmesi gerekiyor:
<manifold.version>2023.1.5</manifold.version>
Kullandığımız bağımlılıklar şunlardır:
<dependencies> <dependency> <groupId>systems.manifold</groupId> <artifactId>manifold-json-rt</artifactId> <version>${manifold.version}</version> </dependency>
Derleme eklentisi, Manifold'u bayt koduna yerleştiren ve onu bizim için kusursuz hale getiren ortak metindir. Pom kurulumunun son kısmı:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>19</source> <target>19</target> <encoding>UTF-8</encoding> <compilerArgs> <!-- Configure manifold plugin--> <arg>-Xplugin:Manifold</arg> </compilerArgs> <!-- Add the processor path for the plugin --> <annotationProcessorPaths> <path> <groupId>systems.manifold</groupId> <artifactId>manifold-json</artifactId> <version>${manifold.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
Kurulum tamamlandıktan sonra kodlara geçelim.
Örnek bir JSON dosyasını proje dizinine kaynak hiyerarşisinin altına yerleştiriyoruz. Bu dosyayı src/main/resources/com/debugagent/json/Test.json
altına yerleştirdim:
{ "firstName": "Shai", "surname": "Almog", "website": "https://debugagent.com/", "active": true, "details":[ {"key": "value"} ] }
Ana sınıfta Maven projesini yeniliyoruz ve yeni bir Test sınıfının göründüğünü fark edeceksiniz. Bu sınıf, Manifold tarafından JSON dosyasına dayalı olarak dinamik olarak oluşturulur. JSON'u değiştirip Maven'i yenilerseniz her şey sorunsuz bir şekilde güncellenir.
Manifold'un bir kod oluşturucu olmadığını anlamak önemlidir. Az önce yazdığımız JSON'u bayt koduna derler.
Test sınıfı, oluşturucu yöntemlerini kullanarak JSON nesneleri oluşturmanıza olanak tanıyan, tür açısından güvenli oluşturucu API'si gibi çeşitli yerleşik yeteneklerle birlikte gelir. Ayrıca write()
ve toJson()
yöntemlerini kullanarak iç içe geçmiş nesneler oluşturabilir ve JSON'u bir dizeye dönüştürebilirsiniz.
Bu artık şunu yazabileceğimiz anlamına gelir:
Test test = Test.builder().withFirstName("Someone") .withSurname("Surname") .withActive(true) .withDetails(List.of( Test.details.detailsItem.builder(). withKey("Value 1").build() )) .build();
Bu, aşağıdaki JSON'u yazdıracaktır:
{ "firstName": "Someone", "surname": "Surname", "active": true, "details": [ { "key": "Value 1" } ] }
Benzer şekilde bir JSON dosyasını aşağıdaki gibi bir kod kullanarak okuyabiliriz:
Test readObject = Test.load().fromJson(""" { "firstName": "Someone", "surname": "Surname", "active": true, "details": [ { "key": "Value 1" } ] } """);
Uzun bir dize yazmak için Java 15 TextBlock
sözdiziminin kullanıldığına dikkat edin. load()
yöntemi, JSON'u okumak için çeşitli API'ler içeren bir nesne döndürür. Bu durumda, bir String
okunur ancak bir URL'den, dosyadan vb. okumak için API'ler vardır.
Manifold, CSV, XML ve YAML dahil olmak üzere çeşitli formatları destekler ve bu formatlardan herhangi birini herhangi bir standart kod yazmadan veya tür güvenliğinden ödün vermeden oluşturmanıza ve ayrıştırmanıza olanak tanır. Bu desteği eklemek için pom.xml dosyasına ek bağımlılıklar eklememiz gerekecek:
<dependency> <groupId>systems.manifold</groupId> <artifactId>manifold-csv-rt</artifactId> <version>${manifold.version}</version> </dependency> <dependency> <groupId>systems.manifold</groupId> <artifactId>manifold-xml-rt</artifactId> <version>${manifold.version}</version> </dependency> <dependency> <groupId>systems.manifold</groupId> <artifactId>manifold-yaml-rt</artifactId> <version>${manifold.version}</version> </dependency> </dependencies>
Bu ek bağımlılıklarla birlikte bu kod, JSON dosyasıyla aynı verileri yazdıracaktır... test.write().toCsv()
ile çıktı şöyle olacaktır:
"firstName","surname","active","details" "Someone","Surname","true","[manifold.json.rt.api.DataBindings@71070b9c]"
Virgülle Ayrılmış Değerler (CSV) çıktısının hiyerarşi bilgilerini içermediğine dikkat edin. Bu, Manifold'un hatası değil, CSV formatının bir sınırlamasıdır.
test.write().toXml()
ile çıktı tanıdık ve şaşırtıcı derecede kısadır:
<root_object firstName="Someone" surname="Surname" active="true"> <details key="Value 1"/> </root_object>
test.write().toYaml()
ile yine tanıdık bir çıktı elde ediyoruz:
firstName: Someone surname: Surname active: true details: - key: Value 1
Manifold ayrıca JSON şemasıyla sorunsuz bir şekilde çalışarak katı kuralları ve kısıtlamaları uygulamanıza olanak tanır. Bu özellikle tarihler ve numaralandırmalarla çalışırken kullanışlıdır.
Manifold, şemaya uyan bayt kodunu sorunsuz bir şekilde oluşturur/güncelleyerek karmaşık JSON verileriyle çalışmayı çok daha kolaylaştırır.
Bu şema Manifold GitHub projesinden kopyalanıp yapıştırılmıştır:
{ "$schema": "http://json-schema.org/draft-07/schema#", "$id": "http://example.com/schemas/User.json", "type": "object", "definitions": { "Gender": { "type": "string", "enum": ["male", "female"] } }, "properties": { "name": { "type": "string", "description": "User's full name.", "maxLength": 80 }, "email": { "description": "User's email.", "type": "string", "format": "email" }, "date_of_birth": { "type": "string", "description": "Date of uses birth in the one and only date standard: ISO 8601.", "format": "date" }, "gender": { "$ref" : "#/definitions/Gender" } }, "required": ["name", "email"] }
Bu nispeten basit bir şema ama burada birkaç şeye dikkatinizi çekmek istiyorum. Adı ve e-postayı gerektiği gibi tanımlar. Manifold'da bir oluşturucu kullanarak bir User
nesnesi oluşturmaya çalıştığımızda build()
yönteminin her iki parametreyi de gerektirmesinin nedeni budur:
User.builder("Name", "[email protected]")
Bu sadece başlangıç... Şema bir tarih içeriyor. Tarihler JSON'da acı verici bir ihtimaldir, standardizasyon zayıftır ve sorunlarla doludur. Şema aynı zamanda etkili bir şekilde numaralandırma olan bir cinsiyet alanı da içerir.
Bunların tümü, LocalDate gibi yaygın Java sınıfları kullanılarak tür açısından güvenli anlambilime dönüştürülür:
User u = User.builder("Name", "[email protected]") .withDate_of_birth(LocalDate.of(1999, 10, 11)) .withGender(User.Gender.male) .build();
Bu, statik içe aktarmayla daha da kısaltılabilir, ancak fikrin özü açıktır. JSON, Manifold'da etkin bir şekilde Java'ya özgüdür.
Manifold güçlü ve heyecan verici bir projedir. Java'da JSON ayrıştırmada devrim yaratıyor, ancak bu yapabileceklerinin yalnızca küçük bir kısmı!
Bu yazıda yeteneklerinin yalnızca yüzeyini çizdik. Bir sonraki makalede Manifold'u daha derinlemesine inceleyeceğiz ve bazı beklenmedik ek özellikleri keşfedeceğiz.
Lütfen Manifold hakkındaki deneyimlerinizi ve düşüncelerinizi yorum kısmında paylaşın. Sorularınız varsa sormaya çekinmeyin.