2015-10-06 51 views
0

我正在使用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是得到一个上下文值持有者

关于如何实现这样的事情的任何想法?

回答

0

看一看Gson's TypeAdaptor

默认情况下使用GSON应用程序类转换成JSON其内置式适配器。如果Gson的默认JSON转换不适合某种类型,请扩展此类以自定义转换。

这个关于how-to-handle-deserializing-with-polymorphism的stackoverflow文章还显示了可能证明相关并帮助你一点的示例代码示例。

你应该关心在运行时编组你应该看看RuntimeTypeAdapterFactory

价值观 - 适应其运行时类型可以从它们的声明类型不同。

...和这些关于convert-from-json-to-multiple-unknown-java-object-types-using-gsonhow-to-deserialize-a-list-of-polymorphic-objects-with-gson的文章也可能证明有用。

+0

TypeAdaptor和JsonDeserializer的问题在于它们被设置了一次并且用于__all__反序列化。我更感兴趣的是在每次调用时定制该适配器的方式,并考虑到它可以在多个线程上工作。 –

+0

我已经更新了我的原始答案,详细介绍了Gson支持基于运行时类型的编组,让我知道这些是否有帮助... – Filip