[Gson二]継承関係のPOJOの逆シーケンス化
3575 ワード
親
package inheritance.test2;
import java.util.Map;
public class Model {
private String field1;
private String field2;
private Map<String, String> infoMap;
public String getField2() {
return field2;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField1() {
return field1;
}
public void setField1(String field1) {
this.field1 = field1;
}
public Map<String, String> getInfoMap() {
return infoMap;
}
public void setInfoMap(Map<String, String> infoMap) {
this.infoMap = infoMap;
}
}
サブクラス
package inheritance.test2;
public class DetailModel extends Model {
private String field3;
private String field4;
public String getField3() {
return field3;
}
public void setField3(String field3) {
this.field3 = field3;
}
public String getField4() {
return field4;
}
public void setField4(String field4) {
this.field4 = field4;
}
}
テストクラス:
package inheritance.test2;
import com.google.gson.Gson;
import org.junit.Assert;
import java.util.HashMap;
import java.util.Map;
public class Test {
@org.junit.Test
public void testGsonInheritance() {
DetailModel dm = new DetailModel();
dm.setField1("field1");
dm.setField2("field2");
dm.setField3("field3");
dm.setField4("field4");
Map<String, String> im = new HashMap<String, String>();
im.put("key1","value1");
im.put("key2","value2");
im.put("key3","value3");
dm.setInfoMap(im);
String str = new Gson().toJson(dm);
System.out.println(str);
Model model = new Gson().fromJson(str, Model.class);
Assert.assertTrue(model.getField1().equals(dm.getField1()));
Assert.assertTrue(model.getField2().equals(dm.getField2()));
Map<String, String> map = model.getInfoMap();
Assert.assertEquals(map.size(), 3);
Assert.assertNotNull(map.get("key1"));
Assert.assertNotNull(map.get("key2"));
dm.setInfoMap(null);
str = new Gson().toJson(dm);
model = new Gson().fromJson(str, Model.class);
map = model.getInfoMap();
Assert.assertNull(map);
}
}
まとめ
1.サブクラスがJSON列にシーケンス化され、JSON列が親にシーケンス化され、対応するフィールドが逆シーケンス化され、他のフィールドが自動的に破棄される.これはオブジェクト向けの特性に合致し、サブクラスの造形は親であり、親を通じて親が提供したデータアクセス方法にアクセスでき、サブクラス自身のデータはアクセスできない
2.逆シーケンス化の場合、POJOのフィールドがJSON列に存在しない場合、POJOのこのフィールドはnull
3.この例は一般的で、より一般的なシーンで、他のシステムからJSONデータ列を取得しているが、JSON列は内容が豊富で、一部のフィールドは自分のシステムに必要なものではなく、簡単なPOJOを定義することができ、逆シーケンス化の際に、興味のあるフィールドとデータを逆シーケンス化してPOJOに入れ、POJOは自分の興味のある内容のみを含む