因此,我使用下面的代码来排除一个已经序列化的特定字段,使其不再被序列化,所以我使用Gson
中的ExclusionStrategy
来完成此操作。
下面的代码为exclusion strategy
:
val gson = GsonBuilder().addSerializationExclusionStrategy(object :
ExclusionStrategy {
override fun shouldSkipField(f: FieldAttributes?): Boolean {
return f?.name?.toLowerCase()?.contains("subdata")!!//the field to be skipped
}
override fun shouldSkipClass(clazz: Class<*>?): Boolean {
return false
}
}).create()
因此,这个对象(Data)包含如上所述的subdata
字段,但在序列化期间,我将取出subdata
字段,因为它已经是serialized
。
val serializedData = gson.toJson(Data)
println("serializedData -> $serializedData")
当我打印serializedData
时,它仍然不包括subData
。
我的问题是,在Data
已经是serialized
之后,有没有办法把上面忽略的subdata
放回serializedData
?
任何帮助或建议将不胜感激。
1条答案
按热度按时间yebdmbv41#
Gson的
ExclusionStrategy
用于完全排除一个类或字段。然而,对于您的用例,您不希望排除字段,而是希望写入已经序列化的JSON数据。这可以通过创建一个自定义的
TypeAdapter
并让它使用JsonWriter.jsonValue(...)
来实现。但是要小心,因为(尽管没有文档说明)只有当你写java.io.Writer
(或String
或类似的)时才支持这个方法,当序列化到JsonElement
(例如,通过使用Gson.toJsonTree(...)
)时,会抛出一个异常,另请参见this pull request。为了不需要为完整的
Data
类编写TypeAdapter
,您可以为包含序列化JSON的字段使用@JsonAdapter
注解(对于您来说,就是subdata
)。遗憾的是,我对Kotlin还不够熟悉,但下面的Java示例可能还是有帮助的:
如果还想支持反序列化,则必须调整
TypeAdapter
或使用TypeAdapterFactory
。尽管
subdata
是否真的必须包含JSON数据可能是个好主意,但当数据来源不可靠时,您也必须小心,因为JsonWriter.jsonValue(...)
不提供安全保证,它可以注入任意的(不限于单个值)甚至是错误的JSON数据。