Gson сериализует POJO с включенным корневым значением? - PullRequest
22 голосов
/ 07 января 2011

У меня проблема с сериализацией объекта с использованием 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"}}

так, в основном, включая элемент верхнего уровня. Я попытался Google способ сделать это в Gson, но не повезло. Кто-нибудь знает, есть ли способ добиться этого?

Спасибо!

Ответы [ 4 ]

20 голосов
/ 07 января 2011

Вам необходимо добавить элемент вверху дерева объектов. Примерно так:

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"}}
15 голосов
/ 08 января 2011

Вместо жесткого кодирования вы можете сделать тип:

...
jo.add(Foo.getClass().getSimpleName(), je);
6 голосов
/ 16 февраля 2016

Лучший способ сделать это - создать класс-оболочку, а затем создать внутри него объект 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"}}
0 голосов
/ 01 сентября 2015

Если вы используете Джексон API, используйте следующие строки

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

...