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. 字符串中不含对象数组,只是简单的对象;使用
    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 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 groupInfos = new ArrayList<>();
    groupInfos.add(groupInfo);
    groupInfos.add(groupInfo1);
    Map 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 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 +
                '}';
    }
}

你可能感兴趣的:(FastJson转对象的坑)