Gson 序列化 POJO 并包含根值?

发布于 2024-10-10 11:19:25 字数 452 浏览 3 评论 0原文

我在使用 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 中搜索一种方法,但没有成功。有人知道是否有办法实现这一目标?

谢谢!

I'm having a problem serializing an object using Gson.

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

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

Gson will serialize this into a JSON

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

However, I want it to be

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

so basically including the top level element. I tried to google a way to do this in Gson, but no luck. Anyone knows if there is a way to achieve this?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

你另情深 2024-10-17 11:19:25

您需要将元素添加到对象树的顶部。像这样的事情:

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"}}

You need to add the element at the top of the the object tree. Something like this:

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"}}
梦中的蝴蝶 2024-10-17 11:19:25

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

...
jo.add(Foo.getClass().getSimpleName(), je);

Instead of hardcoding the type you can do:

...
jo.add(Foo.getClass().getSimpleName(), je);
紫瑟鸿黎 2024-10-17 11:19:25

更好的方法是创建一个包装类,然后在其中创建一个 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"}}

A better way to do this is to create a wrapper class and then create an object of Foo inside it.

Sample code:

public class ResponseWrapper {

   @SerializedName("Foo")
   private Foo foo;

   public Foo getFoo() {
      return foo;
   }

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

Then you can easily parse to JSON using:

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

which will give you the desired structure:

{"Foo":{"number":10,"str":"hello"}}
月亮邮递员 2024-10-17 11:19:25

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

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

If you are using Jackson api use the below lines

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文