Örnek

Java'da JSON Kullanarak Deep Clone Yapan Örnek

Java'da bir object clone() yöntemi ile clone'u (kopya) alınabilir. Ancak bu kopya işlemi sadece nesnenin kopyasını alır. Nesnenin sahip olduğu class tipindeki nesnelerin koypasını almaz. Bunun için nesne JSON'a çevrilip sonradan yeniden object'e çevrilebilir.
Aşağıdaki gibi bir test sınıfı olsun :
public class Test
{
	
	private int no;
	private String name;
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}
Bu test sınıfını kullanan bir ana sınıfı aşağıdaki gibi yapabiliriz :
public class TestDeep{
	
	private int no;
	private Test test;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public Test getTest() {
		return test;
	}
	public void setTest(Test test) {
		this.test = test;
	}
	
}

Gson

Bu yöntemde Serializable ve Cloneable interfaces'lerinin implement edilmesine gerek yoktur.
Aşağıdaki gibi bir uygulama yapalım :
import com.google.gson.Gson;
public class DeepCloneTestGson {
	
	public static void main(String[] args) {
		
		Test t=new Test();
		t.setNo(1);
		t.setName("Tester");
		
		TestDeep parent=new TestDeep();
		parent.setNo(100);
		parent.setTest(t);
							
		Gson gson = new Gson();
		TestDeep t2 = gson.fromJson(gson.toJson(parent), TestDeep.class);
		
		t2.setNo(1283);
		t2.getTest().setNo(1453);
		t2.getTest().setName("Deep");
		
		System.out.println("Orjinal:"+t.getNo()+","+t.getName());
		System.out.println("Orjinal Deep:"+t2.getNo());
		System.out.println("Kopya Deep:"+t2.getTest().getNo()+","
				+t2.getTest().getName());	
		
	}
}
Bu uygulamayı çalıştırdığımızda aşağıdaki gibi bir çıktı üretecektir :
Orjinal:1,Tester
Orjinal Deep:1283
Kopya Deep:1453,Deep
Görüldüğü gibi t nesnesi değiştirilmesine rağmen orjinal nesne değişmemiştir.
t2.getTest().setNo(1453);
t2.getTest().setName("Deep");
Sonuç olarak bir nesneyi içindeki nesnelerin hepsini en alttaki nesnelere gidecek şekilde içerecek şekilde kopyalamak için Gson kullanılabilir.

Jackson

Java'da yaygın kullanılan bir JSON kütüphanesi de Jackson'dır. Aynı uygulamayı Jackson ile yapınca da aynı sonuç alınacaktır.
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DeepCloneTestJackson {
	
	public static void main(String[] args) {
		
		Test t=new Test();
		t.setNo(1);
		t.setName("Tester");
		
		TestDeep parent=new TestDeep();
		parent.setNo(100);
		parent.setTest(t);
							
		TestDeep t2=null;
		try {
			ObjectMapper objectMapper = new ObjectMapper();
			t2 = objectMapper
				      .readValue(objectMapper.writeValueAsString(parent), TestDeep.class);
			
			t2.setNo(1283);
			t2.getTest().setNo(1453);
			t2.getTest().setName("Deep");
			
			System.out.println("Orjinal:"+t.getNo()+","+t.getName());
			System.out.println("Orjinal Deep:"+t2.getNo());
			System.out.println("Kopya Deep:"+t2.getTest().getNo()+","
					+t2.getTest().getName());	
			
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		
	}
}
Jakson'ı Maven ile eklemek için aşağıdaki gibi bağımlılık eklenmesi gerekir:
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-core</artifactId>
	<version>2.13.2</version>
</dependency>
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.13.2.2</version>
</dependency>
zafer.teker , 08.04.2022

Bu Sayfayı Paylaş:

Fibiler Üyelerinin Yorumları


Tüm üyeler içeriklere yorum ekleyerek katkıda bulunabilir : Yorum Gir

Misafir Yorumları




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