我正在使用GSON反序列化一些JSON数据,我对将某些上下文值传递到反序列化过程的方式感兴趣。更具体地讲,假设我们有2类:在对象反序列化期间的共享上下文
class A {
String relativePath;
transient B contextDependentValue;
}
class B {
int y;
A z;
}
和JSON如下:
{
y: 2,
z: {
relativePath: "./foo/bar"
}
}
当尝试反序列化的东西,我想以填充嵌套对象的contextDependentValue
场有些依赖于反序列化上下文的位置(例如contextDependentValue
可能是发现JSON的绝对路径,所以我可以构建完整路径为contextDependentValue + '/' + relativePath
)。对于每个反序列化,这些上下文值将被设置为。
public T deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context,
Map<String, Object> someSortOfContextValuesHolder) {
return buildObjectWithContext(json, someSortOfContextValuesHolder);
}
,并在那里someSortOfContextValuesHolder
将启动每个反序列化时,可以提供:
gson.fromJson(json, B.class, someSortOfContextValuesHolder)
理想的情况下,当问及反序列化我将能够建立一个自定义JsonDeserializer
是得到一个上下文值持有者
关于如何实现这样的事情的任何想法?
TypeAdaptor和JsonDeserializer的问题在于它们被设置了一次并且用于__all__反序列化。我更感兴趣的是在每次调用时定制该适配器的方式,并考虑到它可以在多个线程上工作。 –
我已经更新了我的原始答案,详细介绍了Gson支持基于运行时类型的编组,让我知道这些是否有帮助... – Filip