2011-01-07 8 views
22

У меня проблема с сериализацией объекта с использованием Gson.Gson сериализует POJO с включенным корневым значением?

@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 способ сделать это в Гсоне, но не повезло. Кто-нибудь знает, есть ли способ достичь этого?

Спасибо!

ответ

19

Вам нужно добавить элемент в верхней части дерева объектов. Что-то вроде этого:

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

хорошо, это означает, что мне нужно для жесткого кодирования типа класса «Foo» в элемент. – fei

+0

@fei да. В идеале, то, что вы получаете от Гссона, верно. Правильное представление объекта 'Foo' в JSON -' {"number": 10, "str": "hello"} '. Если есть класс, который имеет Foo как переменную экземпляра, в этом случае вы должны были ожидать '{" foo ": {" number ": 10," str ":" hello "}}' - но если вы хотите добавить имя класса явно, вам нужно будет добавить его явно. – Nishant

15

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

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

Я думаю, что это должен быть комментарий другого ответа, а не ответ сам по себе. Это на самом деле хороший комментарий, хотя – mbritto

-1

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

mapper.configure (SerializationFeature.WRAP_ROOT_VALUE, правда); mapper.configure (DeserializationFeature.UNWRAP_ROOT_VALUE, true);

+0

Название вопроса op op использует GSON, а не jackson – dstarh

6

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

Это гораздо лучший ответ. –

+0

Не совсем, вы создаете еще один объект ... в маленьком приложении с тремя моделями это нормально, но поддерживайте 40+ и пишите эти обертки ... –