Kotlin - com.alibaba.fastjson.JSONException: default constructor not found

本文介绍了使用Kotlin数据类解析JSON时遇到的JSONException,并提供了两种解决方案:一是使用Java实体类,二是添加kotlin-reflect依赖。同时展示了具体的JSON数据、对应的Java实体类与Kotlin数据类,以及如何在代码中实现JSON解析。

Kotlin - com.alibaba.fastjson.JSONException: default constructor not found:

Recently I fell in love with Kotlin. All .java files have become .kt.
Such as the title, there is an exception when parsing JSON using the Kotlin data class.

com.alibaba.fastjson.JSONException: default constructor not found. class [${your Entity Class Name}]
    at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:465)
    at com.alibaba.fastjson.util.JavaBeanInfo.build(JavaBeanInfo.java:211)
    at com.alibaba.fastjson.parser.ParserConfig.createJavaBeanDeserializer(ParserConfig.java:643)
    at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:560)
    at com.alibaba.fastjson.parser.ParserConfig.getDeserializer(ParserConfig.java:373)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:686)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:663)
    at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:658)
    at com.alibaba.fastjson.JSON.parseArray(JSON.java:535)
    ...

I have two ways to solve this problem:

-> ———————————————-Gorgeous Dividing Line———————————————-

1. Use Java Entity Class.

2. Add a Dependency.

<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-reflect</artifactId>
    <version>${kotlin.version}</version>
</dependency>

-> ———————————————-Gorgeous Dividing Line———————————————-

That is all right.


Here is an example:

^ JSON:

{
    "msgtype": "text",
    "text": {
        "content": "it is me."
    },
    "at": {
        "atMobiles": [
            "156xxxx8827",
            "189xxxx8325"
        ],
    "isAtAll": false
    }
}

^^ Java Entity Class

public class Tjava {

    private String msgtype;
    private Text text;
    private At at;

    private class Text {
        private String content;

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }

    private class At {
        private Boolean isAtAll;
        private List<String> atMobiles;

        public Boolean getAtAll() {
            return isAtAll;
        }

        public void setAtAll(Boolean atAll) {
            isAtAll = atAll;
        }

        public List<String> getAtMobiles() {
            return atMobiles;
        }

        public void setAtMobiles(List<String> atMobiles) {
            this.atMobiles = atMobiles;
        }
    }

    public String getMsgtype() {
        return msgtype;
    }

    public void setMsgtype(String msgtype) {
        this.msgtype = msgtype;
    }

    public Text getText() {
        return text;
    }

    public void setText(Text text) {
        this.text = text;
    }

    public At getAt() {
        return at;
    }

    public void setAt(At at) {
        this.at = at;
    }
}

^^ Kotlin Data Class

data class Tkotlin(val msgtype: String?, val text: Text?, val at: At?) {

    data class Text(val content: String?)

    data class At(val isAtAll: Boolean?, val atMobiles: List<String>?)

}

^^^ Parse JSON

// Java
public static void main(String[] args) {

    // Compiled successfully
    Tjava tjava = JSONObject.parseObject(json, Tjava.class);
    // if no dependency, can not compiled
    Tkotlin tkotlin = JSONObject.parseObject(json, Tkotlin.class);
}

// Kotlin
fun main(args: Array<String>) {

    // Compiled successfully
    val tjava = JSONObject.parseObject(json, Tjava::class.java)
    // if no dependency, can not compiled
    val tkotlin = JSONObject.parseObject(json, Tkotlin::class.java)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值