提问人:Gábor 提问时间:11/3/2023 更新时间:11/5/2023 访问量:71
Gson.toJson(PrinterInfo) 返回空对象
Gson.toJson(PrinterInfo) returns empty object
问:
我正在尝试使用 Gson(版本 2.9.0)将对象序列化为 JSON:android.print.PrinterInfo
val type: Class<*> = data.javaClass
json.beginObject()
json.name(type.name)
json.value(gson.toJson(data, type))
Log.d(TAG, data.toString())
json.endObject()
但结果是一个空对象。日志行清楚地表明对象已填充,没有 null 值或类似值(但用于包含 null、漂亮的打印或其他任何内容没有任何区别)。没有例外,只是没有预期的结果。{android.print.PrinterInfo: {}}
GsonBuilder()
答:
主要问题似乎是您正在尝试从 Android 库序列化一个类,而不为此使用自定义 Gson 适配器。在这种情况下,Gson 将使用反射来访问类的字段,包括表示实现细节的私有字段。
即使这可行并且您得到了一个非空的 JSON 对象,它也会包含类的内部数据,因此它可能因 Android 版本而异(甚至可能在不同的 Android 设备之间?并且不能保证您可以使用这种方式正确地重新创建对象。您可能收到的处于不一致状态且无法正常工作。PrinterInfo
Gson.fromJson
PrinterInfo
更好的解决方案是为执行序列化(和反序列化)的类(和引用的类)编写自定义 Gson TypeAdapter
。
或者,因为实现另一个选项可能是使用其方法,而不是将其序列化为 JSON。PrinterInfo
PrinterInfo
Parcelable
writeToParcel
将来还可以使用 Gson 的 ReflectionAccessFilter
来避免意外依赖基于反射的 Android 库类序列化。
可以说,这并不能回答为什么您问题中的 JSON 对象为空,但它强调了尝试(隐式)使用反射对第三方类进行 JSON 序列化有其缺点,并且还有其他替代方法。
评论
PrinterInfo
null
Log.d(TAG, Gson().toJson(data))
PrinterInfo
private
GsonBuilder.disableJdkUnsafe()
),则在反序列化后可能会得到损坏的实例。Gson.fromJson
评论
json
JsonWriter
{android.print.PrinterInfo: {}}
"
val json = Gson()