【问题标题】:Gson serialize POJO with root value included?包含根值的 Gson 序列化 POJO?
【发布时间】:2023-04-05 17:14:01
【问题描述】:

我在使用 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 中执行此操作的方法,但没有运气。任何人都知道是否有办法实现这一目标?

谢谢!

【问题讨论】:

    标签: java json serialization gson


    【解决方案1】:

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

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

    【讨论】:

    • 好吧,这意味着我需要将类类型“Foo”硬编码到元素中。
    • @fei 是的。理想情况下,您从 Gson 获得的信息是正确的。 JSON 中Foo 对象的正确表示是{"number":10,"str":"hello"}。如果有一个类有 Foo 作为它的实例变量,在这种情况下你应该期望{"foo":{"number":10,"str":"hello"}}——但是如果你想显式地添加类名,你必须显式地添加它。
    【解决方案2】:

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

    【讨论】:

    • 这是一个更好的响应。
    • 不是真的,你正在创建另一个对象......在一个有 3 个模型的小应用程序中这没关系,但要保持 40+ 并编写这些包装器......
    【解决方案3】:

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

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

    【讨论】:

    • 问题状态op的标题是使用GSON而不是jackson
    【解决方案4】:

    您可以做的不是硬编码类型:

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

    【讨论】:

    • 我认为这应该是对另一个答案的评论,而不是一个答案本身。不过,这实际上是一个很好的评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多