当前位置: 代码迷 >> Java Web开发 >> json转抽象DTO有关问题
  详细解决方案

json转抽象DTO有关问题

热度:2962   发布时间:2016-04-10 22:55:14.0
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);
    }
}

class Father {
    String name;

    int    age;
    
    // 多加了一个toString 方法,便于检测
    public String toString(){
        return "Fahter's name :"+name+"; Age :"+age;
    }
}

class Son1 extends Father {
    String son1Name;
    public String toString(){
        return "Son1's name :"+son1Name+"; Age :"+age;
    }
}

class Son2 extends Father {
    String son2Name;
    public String toString(){
        return "Son2's name :"+son2Name+"; Age :"+age;
    }
}

class DTO {
    String       dtoName;

    List<Father> sonList;
}


看来你要自己订制做一个了~
------解决方案--------------------
你这json格式就不对:[]是数组不能放名值对,{}是字面量要放名值对。你这混着用。


{'dtoName':'dtoName',list:{'name':'fatherName','age':1,'son1Name':'son1Name'}}
或者
{'dtoName':'dtoName',list:['fatherName',1,'son1Name']}


------解决方案--------------------
{'dtoName':'dtoName',list:[{'name':'fatherName','age':1,'son1Name':'son1Name'},{'name':'fatherName','age':1,'son1Name':'son1Name'},{'name':'fatherName','age':1,'son1Name':'son1Name'}]}
------解决方案--------------------
String s="{\"d\":{\"id\":\"11\",\"name\":\"wc\",\"hh\":{\"s\":\"fff\"}}}";

GG map =decodeObject(s,GG.class);
//JSON.parseObject(s,GG.class);
  相关解决方案