使用 kotlin-reflect 对匿名对象的 Kotlin 反射

Kotlin reflection on Anonymous object using kotlin-reflect

我收到一个 json 对象,其中有一个 属性 我在编译时不知道其名称。

属性 的名称存储在一个变量中。

由于 属性 的名称可能不同,因此 JSON 被解析为匿名对象。

是否可以使用存储在变量中的名称使用反射读取 属性 的值?

我试过类似这样的代码: jsonResponse::class.memberProperties.find { it.name == variableName } 没有成功。

val decodedToken = JWT(jwtString)
decodedToken.getClaim("useful_claim").asObject(Any::class.java)?.let {
  // Get the property that matches the variable name 
  val reflectProp = res::class.memberProperties.find { it.name == BuildConfig.VARIABLE_NAME }
  // Check that the property was found and exists
  if (reflectProp is KMutableProperty<*>) {
    (reflectProp.getter.call(res, BuildConfig.VARIABLE_NAME) as? List<*>)?.let {
      // Return it as a list of existing MyClass
      return it.filterIsInstance<MyClass>()
    }
  }
}

根据 and 的评论,我尝试不使用 JWT 库。

代码如下:

// Parcelable classes
@Parcelize
@JsonClass(generateAdapter = true)
data class JwtCustomResponse(
    // This maps the variable name from the buildconfig on a known field name that can be used later
    @field:Json(name = BuildConfig.VARIABLE_NAME) val appResourceAccess: MyCustomClass? = MyCustomClass()
) : Parcelable


@Parcelize
@JsonClass(generateAdapter = true)
data class JWTBody(
    @field:Json(name = "resource_access") val resourceAccess: JwtCustomResponse? = JwtCustomResponse(),
) : Parcelable

// Custom JWT deserializer
object JWTUtils {

    @Throws(Exception::class)
    fun decoded(JWTEncoded: String): JWTBody {
        val split = JWTEncoded.trim().split(".")
        val mAdapt = moshi.adapter(JWTBody::class.java)
        return mAdapt.fromJson(getJson(split[1])) ?: JWTBody()
    }

    @Throws(UnsupportedEncodingException::class)
    private fun getJson(strEncoded: String): String {
        val decodedBytes: ByteArray = Base64.decode(strEncoded, Base64.URL_SAFE)
        return String(decodedBytes, charset("UTF-8"))
    }
}

// JWT passed to the Utils
val decoded = JWTUtils.decoded(jwtString)