【问题标题】:Jetpack Compose Breaking GSONJetpack Compose 破坏 GSON
【发布时间】:2022-12-03 03:13:50
【问题描述】:

每当我添加时,我都有一个工作的 Android 项目Jetpack Compose 依赖项我的GSON没有按预期工作。奇怪的事情,如果我删除excludeFieldsWithModifiers或者如果我不使用任何遗产对于我使用 GSON 解析的类,它正在工作。

重现步骤:

  1. 添加Jetpack Compose 运行时或者Jetpack Compose 依赖项
  2. 添加GSON依赖关系
  3. 使用GsonBuilder去创造GSON对象并添加excludeFieldsWithModifiers选项
  4. 创建一个简单的类层次结构
  5. 尝试使用 to 解析任何 json儿童班您在上面使用相同的方法创建的GSON对象(创建于步骤 3)

    出于说明目的,我添加了一个样本

    class Response(@SerializedName("id") var id : Int = 0) : BaseResponse()
    open class BaseResponse
    
    val gsonMapper: Gson by lazy {
    GsonBuilder()
        .excludeFieldsWithModifiers(
            java.lang.reflect.Modifier.TRANSIENT. // Can you any other modifier
        )
        .create()
    }
    
    fun responseProcess() {
      try {
          val response = """{"id": 3}"""
          val data = gsonMapper.fromJson(response, Response::class.java)
          Log.d(TAG, "responseProcess: $data")
      } catch (e: Exception) {
          e.printStackTrace()
      }
    }
    

    上述代码的 StackTrace

    2022-11-30 18:14:12.162 14856-14856/com.bhaskar.myapplication W/System.err: java.lang.IllegalArgumentException: class com.bhaskar.myapplication.Response declares multiple JSON fields named $stable
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:172)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.Gson.getAdapter(Gson.java:458)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:926)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:892)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:841)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.google.gson.Gson.fromJson(Gson.java:813)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.bhaskar.myapplication.MainActivityKt.responseProcess(MainActivity.kt:74)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.bhaskar.myapplication.MainActivityKt$Greeting$1$1.invoke(MainActivity.kt:54)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at com.bhaskar.myapplication.MainActivityKt$Greeting$1$1.invoke(MainActivity.kt:53)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.foundation.ClickableKt$clickable$4$gesture$1$2.invoke-k-4lQ0M(Clickable.kt:153)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.foundation.ClickableKt$clickable$4$gesture$1$2.invoke(Clickable.kt:142)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapAndPress$2$1$1.invokeSuspend(TapGestureDetector.kt:223)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlinx.coroutines.DispatchedTaskKt.resume(DispatchedTask.kt:178)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:166)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:397)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:431)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:420)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:328)
        2022-11-30 18:14:12.163 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter$PointerEventHandlerCoroutine.offerPointerEvent(SuspendingPointerInputFilter.kt:511)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.dispatchPointerEvent(SuspendingPointerInputFilter.kt:406)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.SuspendingPointerInputFilter.onPointerEvent-H0pRuoY(SuspendingPointerInputFilter.kt:419)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:310)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:297)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass(HitPathTracker.kt:297)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.NodeParent.dispatchMainEventPass(HitPathTracker.kt:179)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.HitPathTracker.dispatchChanges(HitPathTracker.kt:98)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.input.pointer.PointerInputEventProcessor.process-BIzXfog(PointerInputEventProcessor.kt:80)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.platform.AndroidComposeView.sendMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1159)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.platform.AndroidComposeView.handleMotionEvent-8iAsVTc(AndroidComposeView.android.kt:1109)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at androidx.compose.ui.platform.AndroidComposeView.dispatchTouchEvent(AndroidComposeView.android.kt:1059)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3920)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:3594)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:915)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1957)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at android.app.Activity.dispatchTouchEvent(Activity.java:4182)
        2022-11-30 18:14:12.164 14856-14856/com.bhaskar.myapplication W/System.err:     at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:873)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.View.dispatchPointerEvent(View.java:15458)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:7457)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7233)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6595)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6652)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6618)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:6786)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6626)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:6843)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6599)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:6652)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:6618)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:6626)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:6599)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:9880)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:9718)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:9671)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:10014)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220)
        2022-11-30 18:14:12.165 14856-14856/com.bhaskar.myapplication W/System.err:     at android.os.MessageQueue.nativePollOnce(Native Method)
        2022-11-30 18:14:12.166 14856-14856/com.bhaskar.myapplication W/System.err:     at android.os.MessageQueue.next(MessageQueue.java:335)
        2022-11-30 18:14:12.166 14856-14856/com.bhaskar.myapplication W/System.err:     at android.os.Looper.loop(Looper.java:206)
        2022-11-30 18:14:12.166 14856-14856/com.bhaskar.myapplication W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:8633)
        2022-11-30 18:14:12.166 14856-14856/com.bhaskar.myapplication W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
        2022-11-30 18:14:12.166 14856-14856/com.bhaskar.myapplication W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        2022-11-30 18:14:12.166 14856-14856/com.bhaskar.myapplication W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
    

    谢谢你

【问题讨论】:

    标签: android kotlin gson android-jetpack-compose


    【解决方案1】:

    通过调用excludeFieldsWithModifiers,您可以覆盖默认的修饰符排除项。因此现在你(不小心?)包括static字段,而$stable似乎是一个合成字段added by the compiler(不确定为什么Gson没有检测到它是合成的)。

    您也可以通过在修饰符中添加 Modifier.STATIC 来解决此问题:

    excludeFieldsWithModifiers(Modifier.TRANSIENT or Modifier.STATIC)
    

    (但请注意,这实际上与默认的 Gson 字段排除相同)

    如果出于某种原因需要序列化 ​​static 字段,那么您可能必须编写自定义 ExclusionStrategy 以忽略不需要的 $stable 字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-22
      • 2017-11-12
      • 2021-12-26
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多