Bu Sayfayı Paylaş:

Kavram

Gson

Tanım: JSON'u Java nesnelerine, java nesnelerini de JSON'a çevirmek için kullanılan bir kütüphane

İpucu

Alt Sınıftan Bir Değişken İçeren Nesnelerin JSONa Çevrilmememesi

Üst sınıf ile deklare edilmiş bir değişkene, alt sınıftan bir değişken verilmesine rağmen, JSON'a çevirme sürecinde alt sınıfın alanları JSON'da gözükmemektedir. Gson kütüphanesi, üst sınıfa göre değerlendirme yapmaktadır.
Aşağıdaki gibi bir sınıf olsun:
public class MyObject {
	private String name;
	private MyObject otherObject;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public MyObject getOtherObject() {
		return otherObject;
	}
	public void setOtherObject(MyObject otherObject) {
		this.otherObject = otherObject;
	}
}
Bu sınıftan türüyen başka bir sınıf olsun :
public class MyObjectSub extends MyObject {
	private String label;
	public String getLabel() {
		return label;
	}
	public void setLabel(String label) {
		this.label = label;
	}
}
Dikkat edilirse MyObject sınıfı kendisi sınıfından bir otherObject değişkenine sahip. Bu sınıflardan bir nesne yaratalım ve bunu JSON'a çevirelim :
public static void main(String[] args) {
	MyObject testJson = new MyObject();
	testJson.setName("myobject");
	MyObjectSub testJson2 = new MyObjectSub();
	testJson2.setName("myobject2");
	testJson2.setLabel("myobject2Label");
	testJson.setOtherObject(testJson2);
	Gson gson = new Gson();
	System.out.println(gson.toJson(testJson));
}
Uygulama çalıştırıldığında aşağıdaki gibi bir çıktı görülecektir :
{"name":"myobject","otherObject":{"name":"myobject2"}}
Dikkat edilirse otherObject nesnesinde label özelliği görülmemektedir. Halbuki otherObject nesnesi MyObjectSub tipinde bir nesnedir ve label özelliği olmalıdır. Bu tür bir hata olmasını sebebi MyObject sınıfı içinde MyObject otherObject; şeklinde tanımlı olmasıdır. Bu şekilde label değerini de JSON'a ekleyebilmek için bir JsonSerializer yaratıp serileştirme sürecini değiştirebiliriz :
import java.lang.reflect.Type;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
public class MyObjectSerializer implements JsonSerializer<MyObject> {
	@Override
	public JsonElement serialize(MyObject src, Type typeOfSrc, JsonSerializationContext context) {
		JsonObject element = new JsonObject();
		element.addProperty("name", src.getName());
		if (src instanceof MyObjectSub) {
			MyObjectSub child = (MyObjectSub) src;
			element.addProperty("label", child.getLabel());
			return element;
		}
		return element;
	}
}
Görüldüğü gibi label ve name özelliğini artık kendiniz oluşturuyoruz
Bu sınıfı kullanarak uygulamayı aşağıdaki gibi değiştirelim :
public static void main(String[] args) {
	MyObject testJson = new MyObject();
	testJson.setName("myobject");
	MyObjectSub testJson2 = new MyObjectSub();
	testJson2.setName("myobject2");
	testJson2.setLabel("myobject2Label");
	testJson.setOtherObject(testJson2);
	GsonBuilder gb = new GsonBuilder();
	gb.registerTypeAdapter(MyObjectSub.class, new MyObjectSerializer());
	Gson gson = gb.create();
	System.out.println(gson.toJson(testJson));
}
GsonBuilder yaratıp, registerTypeAdapter yöntemiyle yazdığımız MyObjectSerializer sınıfını veriyoruz. Bu şekilde çalıştırıldığında aşağıdaki gibi basılacaktır:
{"name":"myobject","otherObject":{"name":"myobject2","label":"myobject2Label"}}




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir