Java 使用Gson序列化JSON时包装某些值

Java 使用Gson序列化JSON时包装某些值,java,json,gson,Java,Json,Gson,使用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}}} 我将要序列化的实际

使用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}}}
我将要序列化的实际类可以是任何类,因此我无法在序列化程序中硬编码特定属性。但是我想用它们的类名包装某些属性


如何执行此操作?

但这不是有效的json字符串:

{Order:{cust:Customer:{name:joe, age:21}}}
在应用程序中,您必须正确地建模/实现域类,然后才能将其用于序列化/反序列化json字符串,换句话说,在调用toJson/fromJson方法之前应该知道域类。但是,实际的域类类型可以通过使用Java泛型类型在运行时动态确定

查看Gson用户指南中的部分:

public class Foo<T> {
  public T value;
}
公共类Foo{
公共价值观;
}
要序列化它,请执行以下操作:

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);
Gson-Gson=new-Gson();
类型fooType=newtypetoken(){}.getType();
toJson(foo,fooType);
要反序列化它,请执行以下操作:

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);
Gson-Gson=new-Gson();
类型fooType=newtypetoken(){}.getType();
fromJson(json,fooType);

您绝对需要包装部分,还是可以通过向模型对象添加“clazz”字段来实现类似的功能?我不拥有要序列化和反序列化的对象,因此我不能向它们添加任何内容。当然,但在序列化时,您可以添加一个包含完全限定类名的
clazz
字段,因此,在反序列化时,您可以阅读
clazz
,并使用
Class.forName
返回Java类型。您只需要对根元素执行此操作,因为这样您就可以使用标准的Gson例程。我深入研究了Gson API和源代码,似乎您正在寻找的装饰是不可能做到的(至少我没有找到一种不修改源代码的简单方法)。当然,还有其他库,您可以尝试指定响应类型未知的原因。修饰元素很容易:new JsonObject().add(rootElementName,gson.toJsonTree(object,targetType))…我无法解决的是如何对文档中的任意元素执行此操作。换言之,对根元素很容易做到,但对于某些元素5层的深度,我该如何做到这一点呢?当然,我的意思是,更难的部分是对任意深度的嵌套层做到:-)我仍然不明白为什么需要这个。一旦你有了根类型,Gson就可以通过Reflection反序列化并构建对象。问题的关键是我不知道我要反序列化到哪个类——这就是为什么我想在类名中包装某些元素。如果类名未知,就不必将json字符串的这部分反序列化为具体的java对象。可能您可以更改json字符串并将多个json文件/信息组织为原始字符串,当使用gson进行序列化/反序列化时,这些多个json字段/信息被视为常规java字符串类型。