С добавлением новых полей тоже работает.
package com.javarush.task.task33.task3304;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
/*
Конвертация из одного класса в другой используя JSON
*/
public class Solution {
public static void main(String[] args) throws IOException {
Second s = (Second) convertOneToAnother(new First(), Second.class);
if(s != null) System.out.println(s.getClass().getSimpleName() + " " + s.list );
else System.out.println("null");
First f = (First) convertOneToAnother(new Second(), First.class);
First inFirst = new First();
inFirst.list.add("qwe");
Second s1 = (Second) convertOneToAnother(inFirst, Second.class);
System.out.println(s1.list);
First f1 = (First) convertOneToAnother(new Second(), First.class);
System.out.println(f1.list);
}
public static Object convertOneToAnother(Object one, Class resultClassObject) throws IOException {
ObjectMapper mapper = new ObjectMapper();
String serialized = mapper.writeValueAsString(one);
String serialized2 = serialized.replace(one.getClass().getSimpleName().toLowerCase(), resultClassObject.getSimpleName().toLowerCase());
Object res = mapper.readValue(serialized2, resultClassObject);
return res;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property="className")
@JsonSubTypes(@JsonSubTypes.Type(value=First.class, name="first"))
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public static class First {
public int i =1;
public String name;
List list = new ArrayList<String>();
public First() {
list.add("fff");
}
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property="className")
@JsonSubTypes(@JsonSubTypes.Type(value=Second.class, name="second"))
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
public static class Second {
public int i;
public String name = "SECOND";
List list = new ArrayList<String>();
public Second() {
list.add("sss");
}
}
}