问题: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.Long
Long B1= (Long) jsonObject.get("b1");
// 为避免空指针异常,取保jsonObject.get("?")不是null
Long 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;
}
@Override
public String toString() {
return "CopyGroupInfo{" +
"fileName='" + fileName + '\'' +
", fileLocation='" + fileLocation + '\'' +
", childGroupId=" + childGroupId +
", fileRecNum=" + fileRecNum +
'}';
}
}