Подтвердить что ты не робот

Gson сериализует POJO с включенным корневым значением?

У меня проблема с сериализацией объекта с помощью 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 способ сделать это в Гсоне, но не повезло. Кто-нибудь знает, есть ли способ достичь этого?

Спасибо!

4b9b3361

Ответ 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"}}

Ответ 2

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

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

Ответ 3

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

Ответ 4

Если вы используете Jackson api, используйте приведенные ниже строки

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