android反序列化对象,android - TypeAdapter用于序列化/反序列化Model类中的对象 - 堆栈内存溢出...

我有一个如下所示的JSON响应:

[{

"id":"61051",

"employee_name":"koiudshau",

"employee_salary":"111",

"employee_age":"0",

"profile_image":""

},

{

"id":"61071",

"employee_name":"Nickky Raboy",

"employee_salary":"1234",

"employee_age":"20",

"profile_image":""

}]

我想创建一个自定义类型适配器,将值 employee_name拆分为firstName和secondName ,并将它们存储为名为Name的对象 ,该对象包含firstName和secondName作为参数。 这必须在反序列化过程中完成。

在序列化期间, Name类型的对象必须转换为String (反序列化之前的类型)。

这些是我尝试过的代码。

型号类别:

data class Employee (

@SerializedName("id")

val id: Int = 0,

@SerializedName("employee_name")

val employee_name: Name,

@SerializedName("employee_salary")

val employee_salary: Float = 0f,

@SerializedName("employee_age")

val employee_age: Int = 0,

@SerializedName("profile_image")

val profile_image : String = ""

)

data class Name(val firstName : String = "" , val secondName : String = "")

CustomizedTypeAdapterFactory:

abstract class CustomizedTypeAdapterFactory(private val customizedClass: Class) : TypeAdapterFactory {

override fun create(gson: Gson, type: TypeToken): TypeAdapter? {

return if (type.rawType == customizedClass) customizeMyClassAdapter(gson, type as TypeToken) as TypeAdapter else null

}

private fun customizeMyClassAdapter(gson: Gson, type: TypeToken): TypeAdapter {

val delegate = gson.getDelegateAdapter(this, type)

val elementAdapter = gson.getAdapter(JsonElement::class.java)

return object : TypeAdapter() {

@Throws(IOException::class)

override fun write(out: JsonWriter, value: C) {

val tree = delegate.toJsonTree(value)

beforeWrite(value, tree)

elementAdapter.write(out, tree)

}

@Throws(IOException::class)

override fun read(`in`: JsonReader): C {

val tree = elementAdapter.read(`in`)

afterRead(tree)

return delegate.fromJsonTree(tree)

}

}

}

protected open fun beforeWrite(source: C, toSerialize: JsonElement) {}

protected open fun afterRead(deserialized: JsonElement) {}

}

MyClassTypeAdapterFactory:

class MyClassTypeAdapterFactory : CustomizedTypeAdapterFactory(Name::class.java) {

override fun beforeWrite(source: Name, toSerialize: JsonElement) {

val custom = toSerialize.asJsonObject.get("employee_name").asJsonObject

custom.add("size", JsonPrimitive(custom.entrySet().size))

}

override fun afterRead(deserialized: JsonElement) {

val custom = deserialized.asJsonObject.get("employee_name").asJsonObject

custom.remove("size")

}

}

RetrofitBuilder:

private var retrofitBuilder: Retrofit.Builder = Retrofit.Builder().baseUrl(API_BASE_URL).addConverterFactory(createGsonConverter()).client(okHttpClientBuilder.build())

createGsonConverter():

private fun createGsonConverter() : Converter.Factory {

val gsonBuilder = GsonBuilder()

gsonBuilder.registerTypeAdapterFactory(MyClassTypeAdapterFactory())

val gson = gsonBuilder.create()

return GsonConverterFactory.create(gson)

}

当我运行此代码时,该应用程序崩溃,并显示以下日志消息:

E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.shaheen.gsonparsing, PID: 15147

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Not a JSON Object: "Karolina38606"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值