Tôi đang cố gắng deserialize một mảng JSON bằng cách sử dụng GSON. Tất cả các đối tượng lồng nhau của tôi được nhúng bên trong một đối tượng "được nhúng".GSON: Xóa đối tượng cha mẹ không cần thiết trong khi deserializing
{
"Book": {
"name": "Book 1",
"published": 1999,
"links": {
"url": "www.book1.com"
},
"embedded": {
"Author": {
"name": "John Doe",
"links": {
"url": "www.johndoe.com"
}
}
}
}
}
tôi cũng có thể có một tình huống như thế này:
{
"Book": {
"name": "Book 1",
"published": 1999,
"links": {
"url": "www.book1.com"
},
"embedded": {
"Publisher": {
"name": "Publishing Company",
"links": {
"url": "www.publishingcompany.com"
}
}
}
}
}
Đây là một ví dụ cực kỳ đơn giản. Một số đối tượng của tôi có thể được lồng sâu 2 hoặc 3 cấp độ sâu và tất cả đều nằm trong đối tượng "được nhúng". Ngoài ra, mỗi đối tượng có một "url" lồng nhau bên trong một đối tượng "liên kết". Tôi có khoảng 20 đối tượng mô hình khác nhau, mỗi đối tượng có nhiều trường và mọi người trong số chúng đều có đối tượng "được nhúng". Tôi bắt đầu viết deserializers tùy chỉnh cho mỗi mô hình, nhưng điều đó dường như bỏ lỡ toàn bộ điểm sử dụng gson, và tôi có thể không phải lúc nào cũng biết đối tượng được nhúng là gì.
Tôi tìm thấy điều này answer, nhưng nó là để sắp xếp các đối tượng. Tôi đã cố gắng để tìm ra điều này trong một thời gian và không tìm thấy bất cứ điều gì hoạt động.
mô hìnhMy Book trông như thế này:
public class Book {
String name;
int published;
String url;
Author author;
Publisher publisher;
}
Author lớp:
public class Author {
String name;
String url;
}
lớp Publisher:
public class Publisher {
String name;
String url;
}
Và đây là Sách của tôi deserializer cho đến nay:
public class BookDeserializer implements JsonDeserializer<Book> {
@Override
public Book deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
final JsonObject jsonObject = json.getAsJsonObject();
Book book = new Book();
book.setName(jsonObject.get("name").getAsString());
book.setPublished(jsonObject.get("published").getAsInt());
String url = jsonObject.getAsJsonObject("links").get("url").getAsString();
book.setUrl(url);
// 1) How to get rid of this and skip to the "real" nested object?
final JsonObject embeddedObject = jsonObject.getAsJsonObject("embedded");
// 2) See what the "embedded" object actually is.
String embeddedModel;
Set<Map.Entry<String, JsonElement>> entrySet = embeddedObject.entrySet();
for (Map.Entry<String, JsonElement> entry : entrySet) {
// Author or Publisher
embeddedModel = entry.getKey();
}
// We have the model's key, now add code here to deserialize whatever the object is
return book;
}
}
Tôi vẫn phải phân tích cú pháp và cài đặt từng trường cho Sách. Sau đó, tôi sẽ phải thêm mã để xác định và sử dụng deserializer chính xác cho đối tượng lồng nhau. Hình như tôi vẫn sẽ cần một deserializer tùy chỉnh cho từng đối tượng để có được "url". Tôi khá mới để gson, vì vậy có lẽ chỉ có một cái gì đó mà tôi nhìn, nhưng có vẻ như tôi cũng có thể chỉ cần phân tích cú pháp tất cả các json và thậm chí không sử dụng gson. Có lẽ có một cách để làm phẳng ra json?
Bất kỳ ý tưởng nào về cách phân tích cú pháp này và vẫn sử dụng sự tiện lợi của gson, hoặc điều này thậm chí có thể? Có lẽ Jackson có thể xử lý tốt hơn?
Cant gson deserialize và tuần tự hóa tùy chọn này theo mặc định? Tại sao bạn cần phải viết của riêng bạn? – user489041