Fastjson: com.alibaba.fastjson.JSONException: default constructor not found

Created on 2 Sep 2017  ·  13Comments  ·  Source: alibaba/fastjson

亲测:版本1.2.38

data class User(val name: String, val age: Int)
//data class User(@JSONField(name="name")val name: String,@JSONField(name="age") val age: Int)

val list = mutableListOf()
for (i in 1..10) {
list.add(User("ycx$i", i * 10))
}
val json = JSON.toJSONString(list)
Log.e("==========json======", json)
val pList: MutableList?
try {
pList = JSON.parseArray(json, User::class.javaObjectType)
Log.e("==========", pList.toString())
} catch (e: Exception) {
e.printStackTrace()
}

data class 用第一行那样写会报如题的错误
第二种写法不会报错
亲测Android studio 2.3.3 ext.kotlin_version = '1.1.4-3'
亲测Android studio 3.0 beta4 ext.kotlin_version = '1.1.4-3'

Most helpful comment

我的AS里面也出现这个问题,后来发现是Class.forName("kotlin.reflect.jvm.internal.KClassImpl") 这里出错了。
然后加上compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 就可以了

All 13 comments

import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.annotation.JSONField
import kotlin.collections.*



fun main(args: Array<String>) {

    val dt = DataClass(1,2)
    val json = JSON.toJSONString(dt)
    println(json)
    val clz = DataClass::class
    println(clz.javaObjectType)
    val dt1 = JSON.parseObject(json,clz.javaObjectType)
    println(dt1)

    val dtf = DataClassField(1,2)
    val jsonf = JSON.toJSONString(dtf)
    println(jsonf)
    val clzf = DataClassField::class
    println(clzf.javaObjectType)
    val dt3 = JSON.parseObject(jsonf,clzf.javaObjectType)
    println(dt3)

    val dts = DataClassSimple(1,2)
    val jsons = JSON.toJSONString(dts)
    println(jsons)
    val clzs = DataClassSimple::class
    println(clzs.javaObjectType)
    val dt2 = JSON.parseObject(jsons,clzs.javaObjectType)
    println(dt2)


    val list =  mutableListOf<DataClassSimple>(dts)
    var jsonM = JSON.toJSONString(list)
    println(jsonM)
    val dtM = JSON.parseArray(jsonM,clzs.javaObjectType)
    println(dtM)




    //println(JSON.toJSON(dt))
    //TestClz.test(DataClass(1,2))
    //val gson = GsonBuilder().create()
    //gson.toJson(dt, System.out)
}


data class DataClassSimple(val a : Int, val b : Int)
data class DataClass(@JSONField(name="aa")val a : Int, @JSONField(name="bb")val b : Int)
data class DataClassField(@field:JSONField(name="aaa")val a : Int, @field:JSONField(name="bbb")val b : Int)

主干的代码是没有问题的,版本:1.2.38-preiview-09

您这是用IntelliJ IDEA运行的?我用IntelliJ IDEA测试也是正常的,只是Android Studio测试就不行

好,我明天试试AS

已测试,1.1.63.android也存在同样的问题

可不可以提供一个运行的demo看看怎么能稳定在kotlin解析,现在我各种尝试都没法运行

同问
Android Studio Canary 3.0 Beta4
kotlin version 1.1.4-3

com.alibaba:fastjson:1.2.38com.alibaba:fastjson:1.1.63.android都是报这个错。

很抱歉,之前都是在Intellj中做的验证的,这个周末跟进哈

在Android Studio编译的类也重现不了。。。

那就很尴尬了

@ZYRzyr 你尝试跑一下这个testcase试试呢。 看跟你的有没有差异呢

@neil4dong
我这儿不行。

我的AS里面也出现这个问题,后来发现是Class.forName("kotlin.reflect.jvm.internal.KClassImpl") 这里出错了。
然后加上compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" 就可以了

Was this page helpful?
0 / 5 - 0 ratings