fastjson反序列化异常解决方案(内部类反序列化失败问题) java.lang.IllegalArgumentException: argument type mismatch

本文记录了在使用FastJson进行反序列化时遇到的错误,具体表现为`JSONException`,原因是尝试创建内部类实例失败。测试了三种解决方案:1) 将内部类改为静态内部类;2) 将内部类移到外部;3) 内部类继续嵌套。每种方案都有相应的测试结果,最终找到了解决问题的有效途径。

目录

记录一次在使用FastJson反序列化内部类时遇到的问题。

错误信息如下:

导致如上错误的代码如下:

测试代码如下:

方案一:将内部类写成静态内部类,如下:

测试结果:

方案二:将内部类定义挪到外面定义(或直接定义成public的独立的java文件)

测试结果:

方案三:将内部类继续往里嵌套

测试结果:


记录一次在使用FastJson反序列化内部类时遇到的问题。

  • 错误信息如下:

com.alibaba.fastjson.JSONException: create instance error, class com.test.json.v0.Parent$Daughter

	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:276)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:845)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:300)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:296)
	at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:86)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:857)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:300)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:296)
	at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:86)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:857)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:300)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:698)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:395)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:299)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:572)
at com.test.json.v0.JSONTest.testDeserialize(JSONTest.java:37)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.createInstance(JavaBeanDeserializer.java:271)
	... 42 more

 

  • 导致如上错误的代码如下:

package com.test.json.v0;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Parent {
    private String name;
    private int age;
    private Son son;

    @Getter
    @Setter
    public class Son {
        private String name;
        private int height;
        private Daughter daughter;
    }

    @Getter
    @Setter
    public class Daughter {
        @JSONField(name = "name")
        private String name;
    }

}

 

  • 测试代码如下:

package com.test.json.v0;

import com.alibaba.fastjson.JSON;
import org.junit.Test;


public class JSONTest {

    @Test
    public void testSerialize() {
        Parent p = new Parent();
        p.setName("Tom");
        p.setAge(120);

        Parent.Son son = new Parent().new Son();
        son.setName("Jerry");
        son.setHeight(180);
        p.setSon(son);

        Parent.Daughter daughter = new Parent().new Daughter();
        daughter.setName("Lisa");
        daughter.setHobby("dancing");
        son.setDaughter(daughter);

        String person = JSON.toJSONString(p);
        System.out.println(person);

    }

    /**
     * 该方法会出现异常
     */
    @Test
    public void testDeserialize() {
        System.out.println("--- testDeserialize ---");
        String json = "{\"age\":120,\"name\":\"Tom\",\"son\":{\"daughter\":{\"name\":\"dancing\"},\"height\":180,\"name\":\"Jerry\"}}";
        Parent person = JSON.parseObject(json, Parent.class);
        System.out.println(JSON.toJSONString(person));
    }
}
  • 方案一:将内部类写成静态内部类,如下:

  • 测试结果:

 

 

  • 方案二:将内部类定义挪到外面定义(或直接定义成public的独立的java文件)

  • 测试结果:

 

  • 方案三:将内部类继续往里嵌套

  • 测试结果:

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值