2012-04-05 32 views
1

如何在使用GSON将对象模型序列化为JSON时包装某些值?例如型号:使用Gson序列化JSON时包装某些值

class Order { 
    Customer cust; 
} 

class Customer { 
    String name; 
    int age; 
} 

序列化的客户通常会产生这样的:

{cust:{name:joe, age:21}} 

我想这样做是与类名的附加元素包裹的订单和客户价值。因此,预期的JSON是:

{Order:{cust:Customer:{name:joe, age:21}}} 

实际的类,我将序列化可以是任何东西,所以我不能硬编码到串行特定属性。但我会想用他们的类名称来包装某些属性。

我该怎么做?

+0

你*绝对*需要包装部分,还是可以通过向模型对象添加“clazz”字段来实现类似的功能? – Raffaele 2012-04-05 08:26:02

+0

我不拥有我将序列化和反序列化的对象,所以我不能添加任何东西给他们。 – Josh 2012-04-05 15:27:52

+0

当然,但在序列化时,您可以添加一个持有完全限定类名称的'clazz'字段,因此,在反序列化时,您可以读取'clazz'并使用'Class.forName'取回Java类型。您只需要为根元素执行此操作,因为您可以使用标准的Gson例程。我深入研究了Gson API和源代码,看起来你正在寻找的*装饰*是不可能的(至少我没有找到一个简单的方法而不修改源代码)。当然,还有其他的库,你可以尝试指定为什么响应类型是未知的。 – Raffaele 2012-04-05 20:04:39

回答

0

这不是一个有效的JSON字符串,但:

{Order:{cust:Customer:{name:joe, age:21}}} 

在你的应用程序,你必须建模/实现你的域类可用于序列化/反序列化JSON字符串,在另一个词前正常,调用json/fromJson方法之前,应该知道域类。但是,实际的域类类型可以在运行时动态确定,通过使用Java通用类型。

从GSON用户指南检查出部分Serializing and Deserializing Generic Types

public class Foo<T> { 
    public T value; 
} 

要序列化:

Gson gson = new Gson(); 
Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 
gson.toJson(foo, fooType); 

要反序列化:

Gson gson = new Gson(); 
Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 
gson.fromJson(json, fooType); 
+0

这个问题的关键是我*不知道我要反序列化的是哪个类 - 这就是为什么我想要在类名称中包装某些元素的原因。 – Josh 2012-04-05 15:31:14

+0

如果类的类型是未知的,则不需要将这部分json字符串反序列化为具体的java对象。可能你可以改变你的json字符串,并将多个json文件/信息组织为一个原始字符串,当使用gson进行serialize/deserialize时,这些多个json字段/信息被视为常规java字符串类型。 – yorkw 2012-04-05 21:42:31