FastJson转对象的坑
问题:json复杂对象(含有对象数组)的字符串使⽤JSONOject转对象时,报转换异常
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to batisdemo.TestJsonToString$CopyGroupInfo
分析
1. 可能是内部类的问题,将内部类移出,发现仍然报这个异常;排除内部类问题
2. 发现json串中含有对象数组,类型是JSONArray,使⽤JSONArray转换后,问题解决
json字符串转对象的集中状态
1. 字符串中不含对象数组,只是简单的对象;使⽤
. JSONObject.parseObject(json串, xx.class),如果xx.class是内部类,必须是静态内部类;
2. json字符串在转对象时,按名称对应查,如果在对象中不到名称对应的属性,则该属性为null;
2. 字符串中含有对象数组,数组部分需使⽤JSONArray;
JSONArray.parseArray(((JSONArray) groupInfos1).toJSONString(), xx.class);
3. 不管是Long 类型还是 integer类型,在转成json后,都是数字类型,如 Long a=100L,转成json后是 100。在从json串中获取这个字段时,由于这个字段的类型已经丢失,json会根据数字的⼤⼩⾃动转型,如果⼩于int类型的最⼤值,则是可以转为integer类型,如果数值⼤于int类型能存储的最⼤类型,则可以转为Long。如果是100直接转Long会报错;为了避免这种情况,我们可以将数值转为字符串,然后全部转为Long
public static void main(String[] args) {
Integer a = 100;
Integer a1 = null;
Long b = 100L;
Long b1 = 100000000000000000L;
Long b2 = null;
Map<String,Object> map=new HashMap<>();
map.put("a",a);
map.put("a1",a1);
map.put("b",b);
json转换对象map.put("b1",b1);
map.put("b2",b2);
String str = JSONString(map);
//{"a":100,"b":100,"b1":100000000000000000}
JSONObject jsonObject = JSONObject.parseObject(str);
Integer A= (Integer) ("a");
Long B= (Long) ("b"); //error:java.lang.Integer cannot be cast to java.lang.Long
Long B1= (Long) ("b1");
/
/ 为避免空指针异常,取保("?")不是null
Long BX=Long.("b").toString());
Long BX1=Long.("b1").toString());
}
代码⽰例如下:
@Test
public void buildBidDateIndo() {
BigDataInfo bigDataInfo = new BigDataInfo();
BigDataInfo bigDataInfo = new BigDataInfo();
bigDataInfo.setBizType("023");
bigDataInfo.setNotifyTime(new Date());
GroupInfo groupInfo = new GroupInfo();
groupInfo.setChildGroupId(1000L);
groupInfo.setFileLocation("/nas/group");
groupInfo.setFileName("1.txt");
groupInfo.setFileRecNum(100L);
GroupInfo groupInfo1 = new GroupInfo();
groupInfo1.setChildGroupId(2000L);
groupInfo1.setFileLocation("/nas/group");
groupInfo1.setFileName("2.txt");
groupInfo1.setFileRecNum(200L);
List<GroupInfo> groupInfos = new ArrayList<>();
groupInfos.add(groupInfo);
groupInfos.add(groupInfo1);
Map<String, Object> expansion = new HashMap<>();
expansion.put("groupInfos", groupInfos);
//expansion.put("groupInfos", new ArrayList<>());
expansion.put("groupId", 10L);
bigDataInfo.setExpansion(expansion);
String string = JSONString(bigDataInfo);
System.out.println(string);
System.out.println("-----------------");
// 1.将json字符串装成⼤对象
BigDataInfo bigDataInfo1 = JSONObject.parseObject(string, BigDataInfo.class);
Object groupInfos1 = Expansion().get("groupInfos");
List<CopyGroupInfo> groupInfos2 = null;
if (groupInfos1 instanceof JSONArray) {
// 如果是json的集合,需要使⽤JSONArray转为集合,如果是对象,就使⽤json转为对象;
// 如果使⽤json转内部类,该内部类需要是静态内部类
try {
groupInfos2 = JSONArray.parseArray(((JSONArray) groupInfos1).toJSONString(), CopyGroupInfo.class); }catch (Exception e){
e.printStackTrace();
}
}
for (CopyGroupInfo groupInfo2 : groupInfos2) {
System.out.println(groupInfo2);
System.out.FileName());
}
}
/**
* 功能描述: <;内部类测试>
*/
private static class CopyGroupInfo{
private String fileName;
private String fileLocation;
private Long childGroupId;
private Long fileRecNum;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileLocation() {
return fileLocation;
}
public void setFileLocation(String fileLocation) {
this.fileLocation = fileLocation;
this.fileLocation = fileLocation;
}
public Long getChildGroupId() {
return childGroupId;
}
public void setChildGroupId(Long childGroupId) { this.childGroupId = childGroupId;
}
public Long getFileRecNum() {
return fileRecNum;
}
public void setFileRecNum(Long fileRecNum) { this.fileRecNum = fileRecNum;
}
@Override
public String toString() {
return "CopyGroupInfo{" +
"fileName='" + fileName + '\'' +
", fileLocation='" + fileLocation + '\'' +
", childGroupId=" + childGroupId +
", fileRecNum=" + fileRecNum +
'}';
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论