無味
发布于 2024-03-14 / 12 阅读
0

fastjson.JSONException: can not cast to xxx, value xxx

Exception in thread "main" com.alibaba.fastjson.JSONException: parseLong error, field : id
	at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1569)
	at com.alibaba.fastjson.util.TypeUtils.cast(TypeUtils.java:1127)
	at com.alibaba.fastjson.JSON.toJavaObject(JSON.java:1236)
	at com.zhongan.atlantis.cmdb.bundle.job.handle.AbstractCloudDOConvert.main(AbstractCloudDOConvert.java:31)
Caused by: com.alibaba.fastjson.JSONException: parseLong error, field : id
	at com.alibaba.fastjson.serializer.LongCodec.deserialze(LongCodec.java:86)
	at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:88)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:1413)
	at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:1567)
	... 3 more
Caused by: com.alibaba.fastjson.JSONException: can not cast to long, value : 123s
	at com.alibaba.fastjson.util.TypeUtils.castToLong(TypeUtils.java:908)
	at com.alibaba.fastjson.serializer.LongCodec.deserialze(LongCodec.java:79)
	... 6 more

上面为复现演示代码:

    public static void main(String[] args) {
        com.alibaba.fastjson.JSONObject meta = new com.alibaba.fastjson.JSONObject();
        meta.put("id", "123s");
        TestDO javaObject = JSON.toJavaObject(meta, TestDO.class);
        System.out.println("javaObject = " + javaObject);
    }

    @Data
    public class TestDO {
        private Long id;
    }

简单的就是fastjosn无容错机制。本着希望如果json中的数据类型与do中的数据类型不一致,直接忽略。

官方也有类似issues,但是并未支持

https://github.com/alibaba/fastjson/issues/854

解决方案,hutool工具可以支持

cn.hutool.json.JSONUtil.toBean(meta.toJSONString(), cls)


        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.26</version>
        </dependency>