Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kotlin data class 和泛型JSON.parseObject<Entity>(json)的bug[BUG] #1491

Open
ozy1996 opened this issue May 18, 2023 · 7 comments
Open

kotlin data class 和泛型JSON.parseObject<Entity>(json)的bug[BUG] #1491

ozy1996 opened this issue May 18, 2023 · 7 comments
Assignees
Labels
bug Something isn't working
Milestone

Comments

@ozy1996
Copy link

ozy1996 commented May 18, 2023

kotlin 中解析 data class的问题,是不支持kotlin还是bug呢

1.使用val data = JSON.parseObject<Entity>(json) 会报错
2.val data = JSON.parseObject(json,Entity::class.java)解析不出来,结果是显示默认值,如果entity没有默认值就报错
3.不指定泛型JSON.parseObject(json) 或者 实体类用 class 则不会报错,
data class Entity(
    val name: String = "", val age: Int = 0
)

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val json = """
            {
                "age":5,
                "name":"1234243"
            }
        """.trimIndent()
        val data = json.parseObject<Entity>()
 //           val data = JSON.parseObject<Entity>(json)
//            val data = JSON.parseObject(json,Entity::class.java)
        Log.w("=========>>", "======>>>data:${data}")
    }
}

implementation("com.alibaba.fastjson2:fastjson2-kotlin:2.0.32")
implementation("com.alibaba.fastjson2:fastjson2-extension:2.0.32")

日志信息

com.alibaba.fastjson2.JSONException: TODO, offset 14, character {, line 2, column 15, fastjson-version 2.0.32
W/System.err: 
W/System.err:             {
W/System.err:                 "age":5,
W/System.err:                 "name":"1234243"
W/System.err:             }
W/System.err:         
W/System.err:     at com.alibaba.fastjson2.reader.ObjectArrayReaderMultiType.readObject(ObjectArrayReaderMultiType.java:73)
W/System.err:     at com.alibaba.fastjson2.JSON.parseObject(JSON.java:826)
W/System.err:     at com.alibaba.fastjson2.JSON.parseObject(JSON.java:849)
W/System.err:     at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:23)
W/System.err:     at android.app.Activity.performCreate(Activity.java:8181)
W/System.err:     at android.app.Activity.performCreate(Activity.java:8147)
W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3949)
W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:106)
W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2327)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loopOnce(Looper.java:210)
W/System.err:     at android.os.Looper.loop(Looper.java:299)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:8307)
@ozy1996 ozy1996 added the bug Something isn't working label May 18, 2023
@kraity
Copy link
Collaborator

kraity commented May 19, 2023

您好, 麻烦提供一下Android版本,
若有混淆配置可以提供关键的部分

日志是否类似有 W/cn.krait.test: Accessing hidden field Ljava/lang/invoke******* (blacklist, reflection, denied) 这样的提示, 也可以提供您的部分运行日志

@ozy1996
Copy link
Author

ozy1996 commented May 19, 2023

您好, 麻烦提供一下Android版本, 若有混淆配置可以提供关键的部分

日志是否类似有 W/cn.krait.test: Accessing hidden field Ljava/lang/invoke******* (blacklist, reflection, denied) 这样的提示, 也可以提供您的部分运行日志

您好,这是我的demo http://cloud.file.tdconnect.cn/upload/2023-05-19/2d1a2616-cd38-4ec8-8a62-2976cbac0aeb.zip

@wenshao wenshao added this to the 2.0.33 milestone May 19, 2023
@wenshao
Copy link
Member

wenshao commented May 29, 2023

https://github.com/alibaba/fastjson2/releases/tag/2.0.33
请用新版本验证

@wenshao wenshao modified the milestones: 2.0.33, 2.0.34 May 29, 2023
@ozy1996
Copy link
Author

ozy1996 commented May 30, 2023

https://github.com/alibaba/fastjson2/releases/tag/2.0.33 请用新版本验证
在kotlin中还是一样

implementation("com.alibaba.fastjson2:fastjson2-kotlin:2.0.33")
验证结果:
1. 使用val data = JSON.parseObject(json,Entity::class.java),如果Entity为data class,字段有默认值,解析不会报错,但是解析不出来字段没赋值。字段没有默认值,会报错,如果Entity为普通的class则正常解析
2. 使用val data = JSON.parseObject<Entity>(json),不管是data class 还是普通class 都会报错
val data = JSON.parseObject<Entity>(json)报错日志
W/e.myapplicatio: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (unsupported, reflection, allowed)
W/e.myapplicatio: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (unsupported, reflection, allowed)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
E/e.myapplicatio: The String#value field is not present on Android versions >= 6.0
W/e.myapplicatio: Accessing hidden field Ljava/math/BigDecimal;->intCompact:J (blocked, reflection, denied)
W/e.myapplicatio: Accessing hidden field Ljava/lang/invoke/MethodHandles$Lookup;->IMPL_LOOKUP:Ljava/lang/invoke/MethodHandles$Lookup; (blocked, reflection, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/e.myapplicatio: Accessing hidden method Ljava/lang/invoke/LambdaMetafactory;->metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; (blocked, linking, denied)
W/System.err: com.alibaba.fastjson2.JSONException: TODO, offset 1, character {, line 1, column 2, fastjson-version 2.0.33 {"field1":"123fd23453454354"}
W/System.err:     at com.alibaba.fastjson2.reader.ObjectArrayReaderMultiType.readObject(ObjectArrayReaderMultiType.java:73)
W/System.err:     at com.alibaba.fastjson2.JSON.parseObject(JSON.java:826)
W/System.err:     at com.alibaba.fastjson2.JSON.parseObject(JSON.java:849)
W/System.err:     at com.example.myapplication.MainActivity.onCreate(MainActivity.kt:16)
W/System.err:     at android.app.Activity.performCreate(Activity.java:8181)
W/System.err:     at android.app.Activity.performCreate(Activity.java:8147)
W/System.err:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
W/System.err:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3755)
W/System.err:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3949)
W/System.err:     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:106)
W/System.err:     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
W/System.err:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
W/System.err:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2327)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loopOnce(Looper.java:210)
W/System.err:     at android.os.Looper.loop(Looper.java:299)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:8307)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:577)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1073)
I/SurfaceFactory: [static] sSurfaceFactory = com.mediatek.view.impl.SurfaceFactoryImpl@578a56d
I/MsyncFactory: [static] sMsyncFactory = com.mediatek.view.impl.MsyncFactoryImpl@613d5a2
D/ViewRootImpl[MainActivity]: hardware acceleration = true, sRendererEnabled = true, forceHwAccelerated = false
D/libMEOW: meow new tls: 0xb400007b5ae83080
D/libMEOW: applied 1 plugins for [com.example.myapplication]:
D/libMEOW:   plugin 1: [libMEOW_gift.so]:

@wenshao wenshao modified the milestones: 2.0.34, 2.0.35 Jun 18, 2023
@wenshao
Copy link
Member

wenshao commented Jul 8, 2023

您好, 麻烦提供一下Android版本, 若有混淆配置可以提供关键的部分
日志是否类似有 W/cn.krait.test: Accessing hidden field Ljava/lang/invoke******* (blacklist, reflection, denied) 这样的提示, 也可以提供您的部分运行日志

您好,这是我的demo http://cloud.file.tdconnect.cn/upload/2023-05-19/2d1a2616-cd38-4ec8-8a62-2976cbac0aeb.zip

这个demo无法下载

@wenshao wenshao modified the milestones: 2.0.35, 2.0.36 Jul 8, 2023
@senselesscn
Copy link

您好, 麻烦提供一下Android版本, 若有混淆配置可以提供关键的部分
日志是否类似有 W/cn.krait.test: Accessing hidden field Ljava/lang/invoke******* (blacklist, reflection, denied) 这样的提示, 也可以提供您的部分运行日志

您好,这是我的demo http://cloud.file.tdconnect.cn/upload/2023-05-19/2d1a2616-cd38-4ec8-8a62-2976cbac0aeb.zip

这个demo无法下载

复制url粘贴到浏览器地址栏就可以下载了

@wenshao wenshao modified the milestones: 2.0.36, 2.0.37, 2.0.38 Jul 18, 2023
@wenshao wenshao modified the milestones: 2.0.38, 2.0.39 Jul 29, 2023
@kraity
Copy link
Collaborator

kraity commented Aug 7, 2023

@ozy1996 并非BUG, 报错原因为: 调用错误、缺少反射库, 如下

调用错误:
JSON.parseObject<Entity>(json) 该片段在kotlin下会误调用JSON.parseObject(String text, Type... types) 而此方法仅解析数组

缺少反射库:
当实体类是data class时, 是依赖构造参数名, 需要添加kotlin的反射库 implementation("org.jetbrains.kotlin:kotlin-reflect:1.8.0") 才能获取 kotlin data 的构造器中的所有参数名

正确使用方式:

 val text = """
            {
                "age":5,
                "name":"1234243"
            }

1.JSON.parseObject(Entity::class.java)
2. 若使用fastjson2-kotlin 也可以调用 text.parseObject<Entity>()

同时若使用data class, 需要引入反射库 implementation("org.jetbrains.kotlin:kotlin-reflect:1.8.0"), 1.8.0替换为你的kotlin版本

@wenshao 温少, 在kotlin中调用JSON.parseObject<Entity>(json) 实际传递调用JSON.parseObject(String text, Type... types) , 是否重命名后者的函数名, 或者移除.

@wenshao wenshao modified the milestones: 2.0.39, 2.0.40 Aug 15, 2023
@wenshao wenshao modified the milestones: 2.0.40, 2.0.41 Sep 3, 2023
@wenshao wenshao modified the milestones: 2.0.41, 2.0.42 Oct 5, 2023
@wenshao wenshao modified the milestones: 2.0.42, 2.0.43 Nov 5, 2023
@wenshao wenshao modified the milestones: 2.0.43, 2.0.44 Dec 3, 2023
@wenshao wenshao modified the milestones: 2.0.44, 2.0.45, 2.0.46 Dec 24, 2023
@wenshao wenshao modified the milestones: 2.0.46, 2.0.47 Jan 27, 2024
@wenshao wenshao modified the milestones: 2.0.47, 2.0.x Feb 23, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants