将排除的字段从GsonBuilder添加回对象

wnvonmuf  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(193)

因此,我使用下面的代码来排除一个已经序列化的特定字段,使其不再被序列化,所以我使用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
任何帮助或建议将不胜感激。

yebdmbv4

yebdmbv41#

Gson的ExclusionStrategy用于完全排除一个类或字段。然而,对于您的用例,您不希望排除字段,而是希望写入已经序列化的JSON数据。
这可以通过创建一个自定义的TypeAdapter并让它使用JsonWriter.jsonValue(...)来实现。但是要小心,因为(尽管没有文档说明)只有当你写java.io.Writer(或String或类似的)时才支持这个方法,当序列化到JsonElement(例如,通过使用Gson.toJsonTree(...))时,会抛出一个异常,另请参见this pull request
为了不需要为完整的Data类编写TypeAdapter,您可以为包含序列化JSON的字段使用@JsonAdapter注解(对于您来说,就是subdata)。
遗憾的是,我对Kotlin还不够熟悉,但下面的Java示例可能还是有帮助的:

class LiteralJsonAdapter extends TypeAdapter<String> {
    @Override
    public void write(JsonWriter out, String value) throws IOException {
        // Also encodes null as JSON null
        out.jsonValue(value);
    }

    @Override
    public String read(JsonReader in) throws IOException {
        // JsonReader does not support reading raw JSON data, so would have
        // to deserialize it and afterwards serialize it again
        throw new UnsupportedOperationException("Deserialization is not supported");
    }
}

// Your class
class Data {
    @JsonAdapter(LiteralJsonAdapter.class)
    String subdata;

    // Other fields ...
}

如果还想支持反序列化,则必须调整TypeAdapter或使用TypeAdapterFactory
尽管subdata是否真的必须包含JSON数据可能是个好主意,但当数据来源不可靠时,您也必须小心,因为JsonWriter.jsonValue(...)不提供安全保证,它可以注入任意的(不限于单个值)甚至是错误的JSON数据。

相关问题