各位大虾,小弟有这么一个需求
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);