[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は自分の興味のある内容のみを含む