[alibaba/fastjson]使用@JSONCreator注解,当JSON字段与构造方法参数不匹配时报错

2025-11-24 535 views
8
public class City implements Parcelable {
    public final int code;
    public final String name;
    public final String pinyin;

    @JSONCreator
    public City(@JSONField(name = "code") int code,
                @JSONField(name = "name") String name,
                @JSONField(name = "pinyin") String pinyin) {
        this.code = code;
        this.name = name;
        this.pinyin = pinyin;
    }
}

    @Test
    public void testFullJSON() {
        JSONObject data = new JSONObject();
        data.put("name", "string");
        data.put("code", 1);
        data.put("pinyin", "pinyin");
        City object = TypeUtils.castToJavaBean(data, City.class);
        Assert.assertEquals("string", object.name);
        Assert.assertEquals(1, object.code);
        Assert.assertEquals("pinyin", object.pinyin);
    }

    @Test
    public void testEmptyJSON() {
        City object = TypeUtils.castToJavaBean(new JSONObject(), City.class);
        Assert.assertEquals(null, object.name);
        Assert.assertEquals(0, object.code);
    }

在第二个测试用例中,由于json里面缺少City构造方法中的参数所对应的字段,导致报错:

Caused by: com.alibaba.fastjson.JSONException: default constructor not found. class com.parkingwang.api.service.city.objects.City
    at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:213)
    at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:522)
    at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:457)
    at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:312)
    at com.alibaba.fastjson.util.TypeUtils.castToJavaBean(TypeUtils.java:911)
    ... 30 more

1.1.58.android / 1.2.33

回答

2

第二种方法,由于没有具体的参数,框架不知道用什么样的参数去初始化City。

2

@kimmking 使用构造方法里的参数的默认值不行吗?

8

默认值是什么

3

参数对应类型的默认值。

5

已改用Moshi

8

这是空值没处理好导致的,我周末发布一个版本修正此问题

3

问题已经修复,预计在星期天(7月2日)发布新版本。