Gson序列化包含根值的POJO?

fei*_*fei 22 java serialization json gson

我在使用Gson序列化对象时遇到问题.

@XmlRootElement
class Foo implements Serializable {
    private int number;
    private String str;

    public Foo() {
        number = 10;
        str = "hello";
    }
}
Run Code Online (Sandbox Code Playgroud)

Gson会将其序列化为JSON

{"number":10,"str":"hello"}.

但是,我希望它是

{"Foo":{"number":10,"str":"hello"}},

所以基本上包括顶级元素.我试图谷歌一种方式在Gson做到这一点,但没有运气.任何人都知道是否有办法实现这一目标?

谢谢!

Nis*_*ant 20

您需要在对象树的顶部添加元素.像这样的东西:

Gson gson = new Gson();
JsonElement je = gson.toJsonTree(new Foo());
JsonObject jo = new JsonObject();
jo.add("Foo", je);
System.out.println(jo.toString());
// Prints {"Foo":{"number":10,"str":"hello"}}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这意味着我需要将类类型"Foo"硬编码到元素中. (2认同)

jor*_*own 15

您可以执行以下操作,而不是硬编码类型:

...
jo.add(Foo.getClass().getSimpleName(), je);
Run Code Online (Sandbox Code Playgroud)

  • 我认为这应该是对另一个答案的评论,而不是单独的答案.这实际上是一个很好的评论 (2认同)

Kri*_*P V 6

更好的方法是创建一个包装类,然后在其中创建一个对象Foo.

示例代码:

public class ResponseWrapper {

   @SerializedName("Foo")
   private Foo foo;

   public Foo getFoo() {
      return foo;
   }

   public void setFoo(Foo foo) {
      this.foo= foo;
   }
 }
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下命令轻松解析为JSON:

new GsonBuilder().create().toJson(responseWrapperObj);
Run Code Online (Sandbox Code Playgroud)

这将为您提供所需的结构:

{"Foo":{"number":10,"str":"hello"}}
Run Code Online (Sandbox Code Playgroud)