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<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 +
                '}';
    }
}
### 解决 PP-OCRv4 出现的错误 当遇到 `WARNING: The pretrained params backbone.blocks2.0.dw_conv.lab.scale not in model` 这样的警告时,这通常意味着预训练模型中的某些参数未能匹配到当前配置下的模型结构中[^2]。 对于此问题的一个有效解决方案是采用特定配置文件来适配预训练权重。具体操作方法如下: 通过指定配置文件 `ch_PP-OCRv4_det_student.yml` 并利用已有的最佳精度预训练模型 (`best_accuracy`) 来启动训练过程可以绕过上述不兼容的问题。执行命令如下所示: ```bash python3 tools/train.py -c configs/det/ch_PP-OCRv4/ch_PP-OCRv4_det_student.yml ``` 该方案不仅解决了参数缺失带来的警告,还能够继续基于高质量的预训练成果进行微调,从而提升最终检测效果。 关于蒸馏的概念,在机器学习领域内指的是将大型复杂网络(teacher 模型)的知识迁移到小型简单网络(student 模型)。这里 student 和 teacher 的关系是指两个不同规模或架构的神经网络之间的指导与被指导的关系;其中 teacher 已经经过充分训练并具有良好的性能,而 student 则试图模仿前者的行为模式以达到相似的效果但保持更高效的计算特性。 至于提到的 `Traceback` 错误信息部分,由于未提供具体的跟踪堆栈详情,难以给出针对性建议。不过一般而言,这报错往往涉及代码逻辑错误或是环境配置不当等问题。为了更好地帮助定位和解决问题,推荐记录完整的异常日志,并仔细检查最近修改过的代码片段以及确认依赖库版本的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值