用于嵌套POJO的SerializedName与自定义GSON解串器

wfauudbj  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(107)

我有一个json字符串,我想把它解析成一个java对象。
JSON字符串:

"[{\"name\": \"favorite list\", \"books\": [
    {\"title\": \"bookTitle1\", \"description\": \"book description\"}, 
    {\"title\": \"bookTitle2\"}
]}]"

Java类:

public abstract class BookList {
  public abstract String name;
  public abstract List<Book> books;
}

public abstract class Book {
  public abstract String title;
  public abstract String description;
}

当将JSON字符串反序列化为java对象时,我希望每个book对象都有titledescription字段。如果JSON字符串中缺少description值,我希望title值也设置为description字段。
所需的Java输出:

[{name: "favorite list", books:[
   {"title": "bookTitle1", "description": "book description"},
   {"title": "bookTitle2", "description": "bookTitle2"}
]}]

description字段丢失时,我试图使用@SerializedName注解来获取description字段填充title字段,但它不起作用。解决这个问题的唯一方法是为BookList创建自定义反序列化器吗?为嵌套的Book对象创建反序列化器的最佳方法是什么?

33qvvth1

33qvvth11#

基于你的描述,我没有在类中使用抽象来复制它。如果你愿意,你可以做一些修改。或者,如果你愿意,你可以使用Lombok来使代码更简洁。在线版本可以在here找到

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(final String[] args) {
        final String json = "[\n" +
            "  {\n" +
            "    \"name\": \"favorite list\",\n" +
            "    \"books\": [\n" +
            "      {\n" +
            "        \"title\": \"bookTitle1\",\n" +
            "        \"description\": \"book description\"\n" +
            "      },\n" +
            "      {\n" +
            "        \"title\": \"bookTitle2\"\n" +
            "      }\n" +
            "    ]\n" +
            "  }\n" +
            "]";

        Gson gson = new GsonBuilder()
            .registerTypeAdapter(Book.class, new BookDeserializer())
            .create();
        BookList[] bookLists = gson.fromJson(json, BookList[].class);
        System.out.println(Arrays.toString(bookLists));

    }

    public static class BookList {
        private String name;
        private List<Book> books;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public List<Book> getBooks() {
            return books;
        }

        public void setBooks(List<Book> books) {
            this.books = books;
        }

        @Override
        public String toString() {
            return "BookList{" +
                "name='" + name + '\'' +
                ", books=" + books +
                '}';
        }
    }

    public static class Book {
      private String title;
      private String description;

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        public Book(String title, String description) {
            this.title = title;
            this.description = description;
        }

        @Override
        public String toString() {
            return "Book{" +
                "title='" + title + '\'' +
                ", description='" + description + '\'' +
                '}';
        }
    }

    public static class BookDeserializer implements JsonDeserializer<Book> {

        @Override
        public Book deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
            JsonObject obj = json.getAsJsonObject();
            String title = obj.get("title").getAsString();
            JsonElement descriptionElem = obj.get("description");
            String description = descriptionElem != null ? descriptionElem.getAsString() : title;
            return new Book(title, description);
        }

    }

}

相关问题