Wednesday, September 5, 2012

How to give an alias to propertyName in json-lib

Web projelerinde backend ile Json aracılığıyla haberleşmek gittikçe yaygınlaşıyor. Çalıştığım projelerden birinde servletler veriyi json formatında dönüyor. Java objelerini json'a çevirmek için json-lib kütüphanesini kullanıyoruz. json-lib basit ihtiyaçlar için yeterli bir kütüphane olduğunu söyleyebilirim. Bir java objesini json'a çevirmek için aşağıdaki gibi bir satır yeterli oluyor.
JSONObject.fromObject(obj)

Geliştirme yaparken bir bir sınıfın alanının ismine alias vererek json oluşturmak istedim. Google'da bir miktar aramadan sonra pek bir sonuca ulaşamadım. json-lib java-doc'ları ve bir miktar kaynak kod okuyup saç baş yolduktan sonra çözüme ulaşabildim.

Aşağıdaki gibi bir sınıfınızın olduğunu varsayalım.
public class Kisi {
 private String ad;
 private String soyad;
 
//getters
//setters
Bu alanların json'a çevrilirken name, surname isimlerine dönüştürülmesini, nesnenizin ismininde person olmasını istediğinizi varsayalım.

Bu durumda JsonBeanProcessor sınıfını extend eden kendi sınıfınızı yazıp bu processor'ü JsonConfig'e register ettikten sonra json oluştururken JsonConfig'i de parametre olarak geçmeniz gerekiyor. Biraz karışık oldu. Aşağıdaki kod parçası sınıfımızda istediğimiz alanlara alias ekleyip json string'i dönüyor.
private String toJson(Object obj) {
  
  JsonConfig jsonConfig = new JsonConfig();
  jsonConfig.registerJsonBeanProcessor(Kisi.class,
    new JsonBeanProcessor() {
     public JSONObject processBean(Object bean, JsonConfig jsonConfig) {
      JSONObject jsonObject = null;
      if (bean instanceof Kisi) {
       jsonObject = new JSONObject().accumulate("person", new JSONObject()
        .element("name", ((Kisi) bean).getAd())
        .element("surname", ((Kisi) bean).getSoyad()));
      }
      else {
       jsonObject = new JSONObject(true);
      }
      return jsonObject;
     }
    }
  );
  return JSONObject.fromObject(obj, jsonConfig).toString();
 }
Bu değişikliği yapmadan önce dönen json






Değişiklikten sonraki hali







Kodları içeren örnek uygulamayı adresinden indirebilirsiniz. Konsoldan mvn jetty:run diyerek uygulamayı çalıştırdıktan sonra http://localhost:9090/json-lib/Hello adresinden uygulamaya erişebilirsiniz.