2011-01-07 32 views
22

Tôi đang gặp sự cố khi sắp xếp một đối tượng bằng Gson.Gson tuần tự hóa POJO với giá trị gốc bao gồm?

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

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

Gson sẽ serialize này thành một JSON

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

Tuy nhiên, tôi muốn nó được

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

nên về cơ bản bao gồm các yếu tố cấp cao nhất. Tôi đã cố gắng để google một cách để làm điều này trong Gson, nhưng không có may mắn. Bất cứ ai cũng biết nếu có một cách để đạt được điều này?

Cảm ơn!

Trả lời

19

Bạn cần phải thêm phần tử ở trên cùng của cây đối tượng. Một cái gì đó như thế này:

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

tốt, điều này có nghĩa tôi cần để hardcode kiểu lớp "Foo" vào phần tử. – fei

+0

@fei yes. Lý tưởng nhất, những gì bạn đang nhận được từ Gson là chính xác. Biểu diễn chính xác đối tượng 'Foo' trong JSON là' {"number": 10, "str": "hello"} '. Nếu có một lớp có Foo vì nó là biến cá thể trong trường hợp đó, bạn nên mong đợi '{" foo ": {" number ": 10," str ":" hello "}}' - nhưng nếu bạn muốn thêm vào tên lớp một cách rõ ràng, bạn sẽ phải thêm nó một cách rõ ràng. – Nishant

15

Thay vì thể xác định rõ loại mà bạn có thể làm:

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

Tôi nghĩ rằng đây nên là một bình luận của câu trả lời khác và không phải là một câu trả lời của chính nó. Nó thực sự là một bình luận tốt mặc dù – mbritto

-1

Nếu bạn đang sử dụng Jackson api sử dụng các dòng dưới đây

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

+0

Tiêu đề của op câu hỏi của nhà nước đang sử dụng GSON và không jackson – dstarh

6

Cách tốt hơn để làm điều này là tạo lớp bao bọc và sau đó tạo đối tượng Foo bên trong nó.

Mẫu mã:

public class ResponseWrapper { 

    @SerializedName("Foo") 
    private Foo foo; 

    public Foo getFoo() { 
     return foo; 
    } 

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

Sau đó, bạn có thể dễ dàng phân tích để JSON sử dụng:

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

mà sẽ cung cấp cho bạn cấu trúc mong muốn:

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

Đây là một phản ứng tốt hơn nhiều. –

+0

Không thực sự, bạn đang tạo một đối tượng khác… trong một ứng dụng nhỏ với 3 mô hình này là ok, nhưng duy trì 40+ và viết các trình bao bọc này… –

Các vấn đề liên quan