问题: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是内部类,必须是静态内部类
- 字符串中含有对象数组,数组部分需使用JSONArray;
JSONArray.parseArray(((JSONArray) groupInfos1).toJSONString(), xx.class);
代码示例如下:
@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; } @Override public String toString() { return "CopyGroupInfo{" + "fileName='" + fileName + '\'' + ", fileLocation='" + fileLocation + '\'' + ", childGroupId=" + childGroupId + ", fileRecNum=" + fileRecNum + '}'; } }