Java EE 8’de geliştirilmiş JSON işleme konusunda Mark Struberg
Java topluluğunda, Java Özellik İsteklerine (JSR) ve açık kaynak projelerine katılımları yoluyla geliştirmeyi yönlendiren birçok ilginç kişi vardır. Bazılarını burada yavaş yavaş tanıtmak ve kendileriyle projelerinden bahsetmek istiyorum. Bu sefer Mark Struberg ile Java EE 8 ve Johnzon’un Apache’nin JSON-P ve JSON-B uygulamaları hakkında konuştum.
Thorben Janssen: Geçen sefer yazılım geliştirmeye girişinizden ve birçok Apache projesine katılımınızdan bahsetmiştik. Bu sefer sizlere Java EE 8’den bahsetmek istiyorum. Son aylarda birçok spesifikasyon büyük ilerleme kaydetti ve artık son sürümünü yayınladılar ya da çıkarmak üzereler. Hangi özellikleri özellikle ilginç buluyorsunuz?
marco struberg
Marco Struberg: Uzun bir süre, yabancılara Java EE 8 hiç yayınlanmayacakmış gibi bakmak zorunda kaldı. Orijinal plan 2015’teydi, ancak daha sonra çok geçmeden 2016’ya geri çekildi. Ve muhtemelen Eylül 2017’de bir sürümden söz ediliyor.
Java EE 8 kabaca iki alana bölünebilir. Çok güçlü bir şekilde ele alınan ve ayrıca kendi başlarına ve çok az ilerleme kaydedilen diğer özelliklerde gösterilecek çok sayıda yeni özelliğe sahip projeler. Pek çok yenilik içeren projeler, her yönüyle topluluk odaklıdır. Java EE’deki tüm işlevsel yeniliklerin yaklaşık %85’inin topluluktan geldiğini tahmin ediyorum.
Kişisel olarak Java EE 8’de çok etkili bulduğum bazı özellikler ve özellikler:
- Servlet 4.0’da HTTP/2 desteği
- CDI 2.0 eşzamansız olaylar ve özellikle üreticiler ve çekirdekler için programatik proxy’ler. Ve olduğu gibi arayüz bazında değil java.lang.yansıtmaancak bir alt sınıf proxy’si olarak.
- JSON-B ve özellikle JAX-RS’ye entegrasyonu
- JSON-P ve burada özellikle JsonPatch ve JsonMergePatch desteği
struberg Burada JSON-P ve JSON-B arasında ayrım yapmalıyız.
JSON işleme
JSON-P, JSON İşleme anlamına gelir, yani Java’dan -SON nesnelerini okumak, yazmak ve değiştirmek.
Tehlike. Web’de JSON-P hakkında bilgi ararken, terim aynı zamanda etki alanları arasında JSON bilgilerini paylaşma mekanizması olan “Dolgulu JSON” için de kullanıldığından. JSON dolgusunun doğasında var olan güvensizlik nedeniyle, bu arada CORS (Çapraz Kökenli Kaynak Paylaşımı) ile değiştirilmiştir.
JSON P’ye geri dönelim. JSON-P, Java EE 7’den beri ortalıkta olmasına rağmen, hala olması gerektiği kadar iyi bilinmiyor. JSON-P ile Java’dan JSON yazmak ve okumak gerçekten kolay hale geldi. Her ikisi de JSON-P tarafından desteklenen, temelde farklı iki yaklaşım vardır:
JsonObject
Hiçbir şeyden oluşan bir nesne ağacı javax.json.JsonValuealt sınıflar (JsonNumarası, JsonDizesi, …). Aşağıdaki JSON nesnesini bir değişkene alalım jsonString üzerinde:
{"name":"John Doe", "age":47, "address": {"zip": 12345, "street":"Blubstreet 7"}}
Bu JSON yapısını Java ile okumak istiyorsak şu şekilde yapabiliriz:
JsonReader jsonReader = javax.json.Json.createReader(new StringReader(jsonString));
JsonObject jsonObject = jsonReader.readObject();
O json nesnesi şimdi okunan JSON dizesinin tüm grafiğini alır. Her şey kabaca XML’deki DOM ağacıyla karşılaştırılabilir, yalnızca çok daha fazla bellek dostudur.
Elbette nesne olarak JSON değerleri de oluşturabilirsiniz. yaptığımızdan beri Json Sağlayıcı Daha sık ihtiyacımız olursa, performans nedenleriyle doğrudan getirmek isteriz:
JsonProvider jsonProvider = JsonProvider.provider();
Sonra, yukarıdakiyle tam olarak aynı JSON nesnesini yaratıyoruz.
JsonObject jsonObject =
jsonProvider.createObjectBuilder()
.add("name", "John Doe")
.add("age", 47)
.add("address", jsonProvider.createObjectBuilder()
.add("zip", 12345)
.add("street", "Blubstreet 7"))
.build();
Ve tabii ki hepsini de harcayabiliriz. Bir sunucu uygulamasındaysanız ve bir Servlet Response nesnesi tutuyorsanız, doğrudan yazara yazabilirsiniz. Çıkış Akışı kullanım. Bununla birlikte, örneğimizde yalnızca bir tanesini kullanacağız. Dize Yazarı:
StringWriter sw = new StringWriter();
JsonWriter jsonWriter = jsonProvider.createWriter(sw);
jsonWriter.writeObject(jsonObject);
System.out.println(sw.toString());
Şimdi her 100 ms’de bir metrik sistemden bir JSON nesnesi yazmak istediğinizi hayal ederseniz, bir süre sonra ortaya devasa JSON nesneleri çıkacaktır. Ve gereksiz yere büyük miktarda bellek tüketeceğinden, hepsini aynı anda büyük bir Java JsonObject veya JsonArray olarak okumak istemeyebilirsiniz.
aktarım
İşte tam da bu nedenle JSON-P spesifikasyonunda ayrıca bir “akış” modu vardır. Eğer JsonObject-Tree, DOM ile karşılaştırılır, bu nedenle JSON-P akışı kabaca bir SAX ayrıştırıcısıyla karşılaştırılabilir. Bir JSON nesnesi başlatıldığında, okunduğunda, sonlandırıldığında vb. sonraki olayları alırız. Ve böylece bilgilerimizi akıştan seçebiliriz. İlgili sınıflar paketin içindedir. javax.json.stream.*Örneğin JsonAyrıştırıcı.
Ve bununla Json üreteci JSON akışı da yazabiliriz.
Daha önce bahsedildiği gibi, her 100 ms’de bir ölçülen değeri bir müşteriye, örneğin WebSocket aracılığıyla iletmek istiyorsanız, Json.createGenerator() a Json Dizisi oluştur ve çok uzun bekar Json nesneleri bir iptal isteği gelene kadar diziyi yerleştirin.
Bunların çoğu zaten JSON-P 1.0’da vardı, ancak JSON-P 1.1’de bazı önemli özellikler eklendi. İle JsonReader artık örneğin “bağımsız” da yapabilirsiniz JsonDeğerleri Okuma ve yazma.
Öte yandan, JSON işaretçileri (RFC-6901) ve JSON yamaları (RFC-6902) ve JSON birleştirme yamaları (RFC-7386) oluşturma, uygulama ve düzenleme seçenekleri tamamen yenidir. Son ikisi benzer hizmetleri yerine getirir, ancak ayrıntılarda farklılık gösterir. Farkları daha sonra açıklayacağım ama önce neden böyle bir şeye ihtiyaç duyabileceğinizi kısaca açıklamak istiyorum.
Diyelim ki geçmişteki tüm satın alma işlemlerine sahip bir müşteri hakkında büyük bir müşteri JSON nesnemiz var ve şimdi soyadını değiştirmek istiyoruz. Bu nedenle, tüm JSON nesnesini aktarmak mantıksız olacaktır. Bu, hatta çok fazla trafik oluşturmakla kalmaz, aynı zamanda, örneğin bu arada farklı bir kanaldan yeni bir satın alma işlemi eklenirse, diğer veri değişiklikleriyle potansiyel olarak çakışabilir. Bu “rekabet eden” değişiklik, daha sonra sert bir şekilde mücadele edilecektir. Ve bu tam olarak iki JSON düzeltme eki mekanizmasının devreye girdiği, yalnızca değişikliklerin gönderildiği yerdir.
JSON işaretçileri
Ama önce, JSON işaretçisine hızlı bir bakış. Bunlar, XML’deki XPath’e çok benzer. Kök düğüm, eğik çizgi (“/”) ile temsil edilir ve ardından yalnızca öznitelik adları gelir. JSON’umuzu ilk örneğimizden alalım:
{"name":"John Doe", "age":47, "address": {"zip": 12345, "street":"Blubstreet 7"}}
JSON işaretçisi ile “/Açık adres” Şimdi “Blubstreet 7” den bahsedebilirim.
Ve JSON yaması ile pratik bir örnek geliyor.
JSON yamaları
Bir JSON yaması, bir hedef JSON’a uygulanan “değişiklik işlemleri” içeren bir JSON dizisidir. diferansiyel yamaÖrneğin:
[{ "op": "replace", "path": "/address/zip", "value": 1010 },
{ "op": "add", "path": "/status", "value": “married” }]
O yolher satırın özelliği bir JSON işaretçisidir, operasyon hedef nesneye uygulanacak işlem.
JSON yamaları, bir JSON nesnesinin karmaşık değişikliklerine izin verir, ancak çok fazla yer kaplama dezavantajına sahiptir.
JSON birleştirme yaması
… karşılaştırıldığında daha fazla yer tasarrufu sağlar, ancak aynı zamanda biraz daha sınırlıdır. Örneğin, tam dizi işlemlerine izin vermezler. Sen bir JsonObject, yalnızca değiştirilecek öznitelikleri içerir. Bir özniteliğin silinmesi gerekiyorsa, basitçe açılır sıfır kurulum:
{"age":48,"address":{"street":null}}
json bağlama
Tamamen yeni bir eklenti olan JSON-B’ye geçelim. JSON-B, JSON nesnelerini Java nesnelerine dönüştürmenin açıklama odaklı bir yolu olan JAXB ile karşılaştırılabilir ve bunun tersi de geçerlidir.
Ancak, bu röportajın kapsamını çoktan aştığım için daha fazla ayrıntıya girmekten kaçınacağım.
Ancak JSON-B’nin JAX-RS’ye entegrasyonuna çok kısaca girmek istiyorum. Şimdiye kadar, veri nesnelerinizi zahmetli bir şekilde kendi başınıza JSON’a dönüştürmek zorundaydınız. Ya da biri tescilli arayüzlere dayanıyordu ve artık taşınabilir değildi. JSON-B ile bu sona erdi. Eğer ben kişi.javanesne, şimdi sadece aşağıdakini yazabilirim ve JSON-B dosya dönüştürmeyi yapacak kişi– Bir JSON dizesindeki nesne:
@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("{personalnummer}")
public Person getByIsbn(@PathParam("personalnummer") String personalnummer{
return new Person(personalnummer);
}
Janssen: Spesifikasyonların mevcut durumunu nasıl değerlendiriyorsunuz? Java EE 9’un bir parçası olarak beklenebilecek başka değişiklikler var mı?
struberg Son altı ayda, JSON-P 1.1 ve JSON-B 1.0’da birçok önemli şeyi düzelttik. İki özellik artık pratikte gerçekten kullanılabilir. Bu yüzden sadece minimum değişiklikler bekliyorum.
Janssen: Bir geliştirici, Johnzon ile çalışırken iki standart dışında hangi özelliklerin farkında olmalıdır?
struberg Jackson vs.’den farklı olarak, Apache Johnzon her zaman Java EE spesifikasyonunun bir uygulaması olarak düşünülmüştür. Bu nedenle, API’deki hemen hemen her şeye spesifikasyon yoluyla erişilebilir. Ancak yine de standarda dahil olmayan bazı ilginç özelliklere sahibiz: örneğin, özyinelemeli veri yapılarının işlenmesi ve bunların JSON işaretçileri kullanılarak isteğe bağlı çözünürlüğü.
Johnzon hakkında daha fazla bilgi edinmek istiyorsanız, bu bilgiyi https://johnzon.apache.org adresinde bulabilir veya mailto://[email protected] adresinden bize e-posta gönderebilirsiniz.
Janssen: Bir önceki röportajda bize TomEE’ye katılımınızdan bahsetmiştiniz. Pek çok Apache projesi zaten Java EE 8 özelliği üzerinde çalıştığından veya zaten uyguladığından, Java EE 8 için bir TomEE sürümünün ne zaman beklenebileceği sorusu ortaya çıkıyor. Son sürüm için henüz bir tarih var mı?
struberg Ne yazık ki henüz bir tarih yok, ancak tek tek parçaları topluyoruz. En azından hareket halindeyken JavaOne’dan ilk vuruşu alabileceğimize inanıyorum.
Şu anki planımız, Java EE 7 ve Java EE 8 arasındaki geçiş döneminde çeşitli 8.0.x sürümlerini yayınlamak ve Java EE 8’de gerçekten her şeyi tamamen elde ettiğimizde TomEE 8.1.0’ı yayınlayacağız.
Janssen: Üzerinde çalıştığınız başka projeler var mı?
struberg Evet, çeşitli Apache projelerime ek olarak (örneğin, bir CDI 2.0 uygulaması olarak OpenWebBeans 2.0, yeni çıktı), MicroProfile topluluğuna aktif olarak katılıyorum.
Janssen: Seni nerede bulabilirim?
struberg Çoğunlukla çeşitli Apache posta listelerinde. Ayrıca irc.freenode.net’teki #openwebbeans kanalındaki IRC aracılığıyla ve elbette @struberg Twitter’dan.
Janssen: Röportaj için çok teşekkürler ve projelerinizde bol şans.
()
Haberin Sonu