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)
}