2016-04-12 5 views
0

У меня есть строка JSON:как отобразить значение JSON объекта Java с помощью ДЖЕКСОНА-аннотаций

{ 
   "title": "PowerPoint Presentation", 
   "author": "Hana", 
   "subject": null, 
   "keywords": null, 
   "created_date": "2016-03-25 15:11:17", 
   "modified_date": "2016-03-28 17:27:06", 
   "creator": null, 
   "producer": "LibreOffice 5.0", 
   "pdfversion": null, 
   "file_size": 149225, 
   "total_page": 24 
} 

и объект Java

public class ContentInfo { 

    @JsonProperty("title") 
    private String title; 

    @JsonProperty("author") 
    private String author; 

    @JsonProperty("subject") 
    private String subject; 

    @JsonProperty("keywords") 
    private String keywords; 

    @JsonProperty("created_date") 
    private String createdDate; 

    @JsonProperty("modified_date") 
    private String modifiedDate; 
// (application name that create original file of PDF) 

    @JsonProperty("creator") 
    private String creator; 
// (application name that create PDF) 

    @JsonProperty("producer") 
    private String producer; 

    @JsonProperty("pdfversion") 
    private String pdfversion; 

    @JsonProperty("file_size") 
    private long fileSize; 

    @JsonProperty("total_page") 
    private long totalPage; 

    public ContentInfo() { 
    } 

    public ContentInfo(String title, String author, String subject, String keywords, String createdDate, String modifiedDate, String creator, String producer, String pdfversion, long fileSize, long totalPage, PageViewSetting page_view_setting) { 
     this.title = title; 
     this.author = author; 
     this.subject = subject; 
     this.keywords = keywords; 
     this.createdDate = createdDate; 
     this.modifiedDate = modifiedDate; 
     this.creator = creator; 
     this.producer = producer; 
     this.pdfversion = pdfversion; 
     this.fileSize = fileSize; 
     this.totalPage = totalPage; 
     this.page_view_setting = page_view_setting; 
    } 



    public String getTitle() { 
     return title; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    public String getSubject() { 
     return subject; 
    } 

    public String getKeywords() { 
     return keywords; 
    } 

    public String getCreatedDate() { 
     return createdDate; 
    } 

    public String getModifiedDate() { 
     return modifiedDate; 
    } 

    public String getCreator() { 
     return creator; 
    } 

    public String getProducer() { 
     return producer; 
    } 

    public String getPdfversion() { 
     return pdfversion; 
    } 

    public long getFileSize() { 
     return fileSize; 
    } 

    public long getTotalPage() { 
     return totalPage; 
    } 

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

    public void setAuthor(String author) { 
     this.author = author; 
    } 

    public void setSubject(String subject) { 
     this.subject = subject; 
    } 

    public void setKeywords(String keywords) { 
     this.keywords = keywords; 
    } 

    public void setCreatedDate(String createdDate) { 
     this.createdDate = createdDate; 
    } 

    public void setModifiedDate(String modifiedDate) { 
     this.modifiedDate = modifiedDate; 
    } 

    public void setCreator(String creator) { 
     this.creator = creator; 
    } 

    public void setProducer(String producer) { 
     this.producer = producer; 
    } 

    public void setPdfversion(String pdfversion) { 
     this.pdfversion = pdfversion; 
    } 

    public void setFileSize(long fileSize) { 
     this.fileSize = fileSize; 
    } 
} 

Я использую следующий код, чтобы отобразить их:

ObjectMapper objectMapper = new ObjectMapper(); 
      objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
      data = objectMapper.readValue(this.jsonContentInfoData, ContentInfo.class); 

Однако результат ResponseBody неверен в некотором поле:

"content_info": { 
"title": "PowerPoint Presentation" 
"author": "Hana" 
"subject": null 
"keywords": null 
"created_date": "2016-03-25 15:11:17" 
"creator": null 
"producer": "LibreOffice 5.0" 
"pdfversion": null 
"modified_date": "2016-03-28 17:27:06" 
"file_size": 0 
"total_page": 0 
} 
+0

Вы поставили точку останова на строку data = и проверили значение 'this.jsonContentInfoData' для правильности? Кроме того, у вашего класса ContentInfo есть getters/setters? Ваши поля закрыты, поэтому я предполагаю, что вы это делаете. Я бы проверял, что те, которые не установлены, не имеют должным образом названного getter и setter. – pczeus

+0

Я отлаживал его. this.jsonContentInfoData верна – Adam

+0

ОК, можете ли вы показать нам весь класс ContentInfo? – pczeus

ответ

0

Jackson сериализует и десериализует на основе модификатора доступа вашего поля в сочетании с доступным и правильно названным методом получения и установки.

Вы можете переопределить эту функцию, чтобы обеспечить все частные поля сер/десериализованными с помощью:

mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); 

Однако, это приличное для тестирования, но это не является оптимальным решением. Вместо этого вы должны использовать частные поля и использовать публичные геттеры/сеттеры для управления процессом сериализации и десериализации.

  • Публичный Getter Делает непубличных поле Сериализуемый и Deserializable

    Unintuitively Поглотитель также делает частное поле deserializable, а также - потому что, когда он имеет поглотитель, поле считается имущество.

  • Публичный сеттер Делает непубличных поля Deserializable Только

В своем коде, показывая геттеры/сеттеры:

  1. setPdfversion - неправилен: Должно быть setPdfVersion
  2. getTotalPage(long totalPage) - Неверный формат и должен быть setTotalPage(long totalPage)

Наконец, я думаю, что это поможет изменить типы totalPage и fileSize от примитивного long к объекту обертку Long. Также измените геттер/сеттеры для этих полей, чтобы они соответствовали типам Long. Поскольку оба этих поля имеют проблемы и используют примитивы, кажется возможным, что Джексон (или ваша версия) не обрабатывает примитивы.

+0

Я использую частные поля и покажу публичные геттеры/serters. результат тот же – Adam

+0

Пожалуйста, прочитайте ответ - специально для последних двух пронумерованных элементов, отображающих неверно названный getter/setter – pczeus

+0

Нет, просто неправильно в файлах, которые имеют 2 слова example fileize, createdDate ... – Adam

Смежные вопросы