有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Jackson反序列化复杂的Json

我遇到了一个关于“复杂”json的问题:

{
  "Books": [
    {
      "title": "Java",
      "instructions": [],
      "links": {
        "EJB": {
          "href": "www.java.com/EJB"
        }
      }
    },
    {
      "title": "C#",
      "instructions": [],
      "links": {
        "SOAP": {
          "href": "www.C#.com/SOAP"
        }
      }
    }]
}

有人能告诉我如何反序列化这种JSON以获得POJO列表吗

POJO必须是一本包含三个字段的“书”:标题、说明和链接

谢谢


共 (2) 个答案

  1. # 1 楼答案

    您的POJO类可以如下所示:

    class Books {
    
        @JsonProperty("Books")
        private List<Book> books;
    
        public List<Book> getBooks() {
            return books;
        }
    
        public void setBooks(List<Book> books) {
            this.books = books;
        }
    
        @Override
        public String toString() {
            return "Books [books=" + books + "]";
        }
    }
    
    class Book {
    
        private String title;
        private List<String> instructions;
        private Map<String, Link> links;
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public List<String> getInstructions() {
            return instructions;
        }
    
        public void setInstructions(List<String> instructions) {
            this.instructions = instructions;
        }
    
        public Map<String, Link> getLinks() {
            return links;
        }
    
        public void setLinks(Map<String, Link> links) {
            this.links = links;
        }
    
        @Override
        public String toString() {
            return "Book [title=" + title + ", instructions=" + instructions + ", links=" + links + "]";
        }
    }
    
    class Link {
    
        private String href;
    
        public String getHref() {
            return href;
        }
    
        public void setHref(String href) {
            this.href = href;
        }
    
        @Override
        public String toString() {
            return href;
        }
    }
    

    简单用法:

    ObjectMapper mapper = new ObjectMapper();
    
    System.out.println(mapper.readValue(json, Books.class));
    

    以上程序打印:

    Books [books=[Book [title=Java, instructions=[], links={EJB=www.java.com/EJB}], Book [title=C#, instructions=[], links={SOAP=www.C#.com/SOAP}]]]
    
  2. # 2 楼答案

    首先,JSON有一个根本性的问题;您有重复的成员名称

    在这种情况下,解析器的行为是未定义的。由于jsonschema2pojo使用Jackson,这意味着您将获得每个重复成员的last定义值

    使用数组:

    [
    {
      "title":"Title 1",
      "instructions" : [],
      "links": {
        "link 1": {
          "href": "The link 1"
        }
      }
    },
    {
       "title":"Title 2",
       "instructions" : [],
       "links": {
        "link 2": {
          "href": "The link 2"
        }
      }
    }
    ]
    

    然后,jsonschema2pojo将不会真正反序列化为POJO;您真正想要的是为数组元素(即一个对象)定义类MyClass,并使用Jackson的ObjectMapper反序列化:

    final TypeReference<List<MyClass>> typeref
        = new TypeReference<List<MyClass>>() {};
    
    final ObjectMapper mapper = new ObjectMapper();
    
    final List<MyClass> list = mapper.readValue(whatever, typeref);