25

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

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

    public Foo() {
        number = 10;
        str = "hello";
    }
}

Gson 会将其序列化为 JSON

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

但是,我希望它是

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

所以基本上包括顶级元素。我试图用谷歌搜索一种在 Gson 中执行此操作的方法,但没有运气。任何人都知道是否有办法实现这一目标?

谢谢!

4

4 回答 4

23

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

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"}}
于 2011-01-07T07:31:15.063 回答
15

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

...
jo.add(Foo.getClass().getSimpleName(), je);
于 2011-01-08T17:32:05.980 回答
7

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

示例代码:

public class ResponseWrapper {

   @SerializedName("Foo")
   private Foo foo;

   public Foo getFoo() {
      return foo;
   }

   public void setFoo(Foo foo) {
      this.foo= foo;
   }
 }

然后您可以使用以下方法轻松解析为 JSON:

new GsonBuilder().create().toJson(responseWrapperObj);

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

{"Foo":{"number":10,"str":"hello"}}
于 2016-02-16T05:51:03.843 回答
-3

如果您使用的是 Jackson api,请使用以下行

mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);

于 2015-09-01T03:25:06.340 回答