日期:2014-05-17  浏览次数:20660 次

json转抽象DTO问题
各位大虾,小弟有这么一个需求
class Father{
    String name;
    int age;
}
class Son1 extends Father{
    String son1Name;
}
class Son2 extends Father{
    String son2Name;
}

class DTO{
    String dtoName;
    List<Father> sonList;
}

需要把一个json串{'dtoName':'dtoName',['name':'fatherName','age':1,'son1Name':'son1Name']}
映射到DTO对象中,这里有一个关键点,DTO所定义的LIST是父类,而json串中是包含有子类的属性。

问题是:不知道是否有这么一个第三方json库,支持在一个配置文件里配置,我的DTO里的list属性
中的类型是SON1,然后反序列化的时候,把json串映射到DTO中。

------解决方案--------------------
尝试了下google的JSon处理,似乎无法满足你的要求:
import java.util.ArrayList;
import java.util.List;

import com.google.gson.Gson;

public class JSonTest {
    public static void main(String[] args) {
        // 给定的JSon有问题
        //String strJSon = "{\"dtoName\":\"dtoName\",[\"name\":\"fatherName\",\"age\":1,\"son1Name\":\"son1Name\"]}";

        Gson gson = new Gson();

        DTO dto = new DTO();
        dto.dtoName = "dtoName";
        List<Father> sonList = new ArrayList<Father>();
        Father f = new Father();
        f.name = "fatherName";
        f.age = 1;
        Son1 s = new Son1();
        s.son1Name = "son1Name";
        sonList.add(f);
        sonList.add(s);
        dto.sonList = sonList;
        
        String strJSon = gson.toJson(dto);// 获得正确的json 字符串的格式
        System.out.println(strJSon);
        
        // json字符串转换为对象
        DTO dto2 = gson.fromJson(strJSon, DTO.class);
        List<Father> sonList2 = dto2.sonList;
        // 检测
        System.out.println("dtoName:"+dto2.dtoName);
        for(Father tmp:sonList2){
            System.out.println(tmp);// 第二次的打印会当做Father处理
        }
        
        // 强转个对象
        Son1 son12 = (Son1)sonList2.get(1);// 这里会抛异常,说明json处理后,只保留了Son1的Father属性
        System.out.println(son12);
    }
}