FastJson转对象的坑

问题:json复杂对象(含有对象数组)的字符串使用JSONOject转对象时,报转换异常

    java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.lq.mybatisdemo.TestJsonToString$CopyGroupInfo

分析

  1. 可能是内部类的问题,将内部类移出,发现仍然报这个异常;排除内部类问题
  2. 发现json串中含有对象数组,类型是JSONArray,使用JSONArray转换后,问题解决

json字符串转对象的集中状态

  1. 字符串中不含对象数组,只是简单的对象;使用
    JSONObject.parseObject(json串, xx.class),如果xx.class是内部类,必须是静态内部类
  2. 字符串中含有对象数组,数组部分需使用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 +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/SevenLitile/article/details/86352646