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

目录

记录一次在使用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文件)

  • 测试结果:

 

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

  • 测试结果:

 

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中的Fastjson库提供了一种方便的方式来进行JSON序列化和反序列化操作。要使用Fastjson进行反序列化,你需要按照以下步骤进行操作: 1. 首先,确保你已经将Fastjson库添加到你的项目中。你可以通过Maven或者手动下载并导入jar文件来添加依赖。 2. 创建一个Java类,该类的结构应该与你要反序列化的JSON数据的结构相匹配。 3. 导入Fastjson的相关类,包括JSON和JSONObject。 4. 使用JSON类的parseObject()方法将JSON字符串转换为JSONObject对象。 5. 使用JSONObject对象的toJavaObject()方法将JSONObject转换为你定义的Java类对象。 下面是一个简单的示例代码,演示了如何使用Fastjson进行反序列化: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class Main { public static void main(String[] args) { // JSON数据 String jsonString = "{\"name\":\"John\",\"age\":30}"; // 将JSON字符串转换为JSONObject对象 JSONObject jsonObject = JSON.parseObject(jsonString); // 将JSONObject对象转换为Java对象 Person person = jsonObject.toJavaObject(Person.class); // 打印Java对象的属性值 System.out.println("Name: " + person.getName()); System.out.println("Age: " + person.getAge()); } } class Person { private String name; private int age; // 省略getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` 在上面的示例中,我们首先将JSON字符串转换为JSONObject对象,然后将JSONObject对象转换为Person类的实例。最后,我们可以通过调用Person对象的getter方法来获取属性值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值