问题:json复杂对象(含有对象数组)的字符串使用JSONOject转对象时,报转换异常
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.lq.mybatisdemo.TestJsonToString$CopyGroupInfo
分析
- 可能是内部类的问题,将内部类移出,发现仍然报这个异常;排除内部类问题
- 发现json串中含有对象数组,类型是JSONArray,使用JSONArray转换后,问题解决
json字符串转对象的集中状态
- 字符串中不含对象数组,只是简单的对象;使用
-
JSONObject.parseObject(json串, xx.class),如果xx.class是内部类,必须是静态内部类; json字符串在转对象时,按名称对应查找,如果在对象中找不到名称对应的属性,则该属性为null;
-
- 字符串中含有对象数组,数组部分需使用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);map.put("b1",b1);map.put("b2",b2);String str = JSON.toJSONString(map);//{"a":100,"b":100,"b1":100000000000000000}JSONObject jsonObject = JSONObject.parseObject(str);Integer A= (Integer) jsonObject.get("a");Long B= (Long) jsonObject.get("b"); //error:java.lang.Integer cannot be cast to java.lang.LongLong B1= (Long) jsonObject.get("b1");// 为避免空指针异常,取保jsonObject.get("?")不是nullLong BX=Long.valueOf(jsonObject.get("b").toString());Long BX1=Long.valueOf(jsonObject.get("b1").toString());}
代码示例如下:
@Test
public void buildBidDateIndo() {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 = JSON.toJSONString(bigDataInfo);System.out.println(string);System.out.println("-----------------");// 1.将json字符串装成大对象BigDataInfo bigDataInfo1 = JSONObject.parseObject(string, BigDataInfo.class);Object groupInfos1 = bigDataInfo1.getExpansion().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.println(groupInfo2.getFileName());}}
/*** 功能描述: <内部类测试>*/
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;}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;}@Overridepublic String toString() {return "CopyGroupInfo{" +"fileName='" + fileName + '\'' +", fileLocation='" + fileLocation + '\'' +", childGroupId=" + childGroupId +", fileRecNum=" + fileRecNum +'}';}
}