2017-08-15 110 views
1

我想映射我的JSON到杰克逊的POJO类,但我收到空值。 如果我删除@JsonIgnoreProperties注解则抛出无法识别的属性Json字符串到Java对象映射失败与杰克逊

的JSON例外:

{ 
    "TileLevel":[ 

    ], 
    "SystemLevel":[ 
     { 
     "Title":"Test System Level Alert", 
     "Description":"<div class=\"ExternalClassA5AAC8F74C874A2D9DB8337EB6685B2A\"><p>​Test System Level Alert​<br></p><p>check the url http&#58;//www.google.com<br></p><p><span style=\"font-size&#58;32px;\">formatting tested</span><br></p></div>", 
     "AnnouncementType":"System Level", 
     "ActiveF":null, 
     "TileName":null 
     } 
    ], 
    "Announcements":[ 
     { 
     "Title":"Test Announcement", 
     "Description":"<div class=\"ExternalClass16980D07D2FB4AB58A2E97C16B7626D3\"><p>​Testing.....&#160;<img src=\"/sites/salesbk-CN/SiteCollectionImages/Salesbook%20Announcements/AllItems/00007-confiz-test-doc7.png\" alt=\"00007-confiz-test-doc7.png\" style=\"margin&#58;5px;\" /><br></p></div>", 
     "AnnouncementType":"Announcement", 
     "ActiveF":null, 
     "TileName":null 
     } 
    ] 
} 

我得到这个JSON作为字符串,然后尝试这个字符串到Java对象转换。

这里是我的POJO类:

public class SPOAnnouncement { 

    @JsonIgnoreProperties 
    private Map<String, List<List<SPOAnnouncements_Properties>>> TileLevel; 
    private Map<String, List<List<SPOAnnouncements_Properties>>> SystemLevel; 
    private Map<String, List<List<SPOAnnouncements_Properties>>> Announcements; 

    public Map<String, List<List<SPOAnnouncements_Properties>>> getTileLevel() { 
     return TileLevel; 
    } 

    public void setTileLevel(Map<String, List<List<SPOAnnouncements_Properties>>> tileLevel) { 
     TileLevel = tileLevel; 
    } 

    public Map<String, List<List<SPOAnnouncements_Properties>>> getSystemLevel() { 
     return SystemLevel; 
    } 

    public void setSystemLevel(Map<String, List<List<SPOAnnouncements_Properties>>> systemLevel) { 
     SystemLevel = systemLevel; 
    } 

    public Map<String, List<List<SPOAnnouncements_Properties>>> getAnnouncements() { 
     return Announcements; 
    } 

    public void setAnnouncements(Map<String, List<List<SPOAnnouncements_Properties>>> announcements) { 
     Announcements = announcements; 
    } 
} 

public class SPOAnnouncements_Properties { 


    private String Title; 
    private String Description; 
    private String AnnouncementType; 
    private String ActiveF; 
    private String TileName; 

    public String getTitle() { 
     return Title; 
    } 

    public void setTitle(String title) { 
     Title = title; 
    } 

    public String getDescription() { 
     return Description; 
    } 

    public void setDescription(String description) { 
     Description = description; 
    } 

    public String getAnnouncementType() { 
     return AnnouncementType; 
    } 

    public void setAnnouncementType(String announcementType) { 
     AnnouncementType = announcementType; 
    } 

    public String getActiveF() { 
     return ActiveF; 
    } 

    public void setActiveF(String activeF) { 
     ActiveF = activeF; 
    } 

    public String getTileName() { 
     return TileName; 
    } 

    public void setTileName(String tileName) { 
     TileName = tileName; 
    } 

} 

我的测试方法来验证,如果结果已被映射到JSON对象:

@Test 
public void convertJsonToObject() throws IOException { 

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
    SPOAnnouncement spoAnnouncement = mapper.readValue(response, SPOAnnouncement.class); 
    System.out.print(spoAnnouncement); 
} 
+3

无关:请阅读有关Java命名约定。字段名称也是camelCase。你去UpperCase的习惯会让其他人感到困惑。 – GhostCat

+0

然后:阅读[mcve]。显示**最小**示例。为什么要建立一个3层嵌套的例子,当可能更简单的事情会做? – GhostCat

+0

神圣的guacomoley。请编辑你的问题,并使所有类字段camelCase。现在很难看到什么是类和什么是一个领域。 – Tschallacka

回答

1

你的POJO结构无效。查看http://www.jsonschema2pojo.org - 一种用于从JSON生成Java POJO的在线工具。

您的课程应该看起来或多或少像下面,但您需要用ActiveFTileName字段替换为优先类型。

-----------------------------------com.example.Announcement.java----------------------------------- 

package com.example; 

import java.util.HashMap; 
import java.util.Map; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
     "Title", 
     "Description", 
     "AnnouncementType", 
     "ActiveF", 
     "TileName" 
}) 
public class Announcement { 

    @JsonProperty("Title") 
    private String title; 
    @JsonProperty("Description") 
    private String description; 
    @JsonProperty("AnnouncementType") 
    private String announcementType; 
    @JsonProperty("ActiveF") 
    private Object activeF; 
    @JsonProperty("TileName") 
    private Object tileName; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    @JsonProperty("Title") 
    public String getTitle() { 
     return title; 
    } 

    @JsonProperty("Title") 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    @JsonProperty("Description") 
    public String getDescription() { 
     return description; 
    } 

    @JsonProperty("Description") 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    @JsonProperty("AnnouncementType") 
    public String getAnnouncementType() { 
     return announcementType; 
    } 

    @JsonProperty("AnnouncementType") 
    public void setAnnouncementType(String announcementType) { 
     this.announcementType = announcementType; 
    } 

    @JsonProperty("ActiveF") 
    public Object getActiveF() { 
     return activeF; 
    } 

    @JsonProperty("ActiveF") 
    public void setActiveF(Object activeF) { 
     this.activeF = activeF; 
    } 

    @JsonProperty("TileName") 
    public Object getTileName() { 
     return tileName; 
    } 

    @JsonProperty("TileName") 
    public void setTileName(Object tileName) { 
     this.tileName = tileName; 
    } 

    @JsonAnyGetter 
    public Map<String, Object> getAdditionalProperties() { 
     return this.additionalProperties; 
    } 

    @JsonAnySetter 
    public void setAdditionalProperty(String name, Object value) { 
     this.additionalProperties.put(name, value); 
    } 

} 
-----------------------------------com.example.SPOAnnouncement.java----------------------------------- 

package com.example; 

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
     "TileLevel", 
     "SystemLevel", 
     "Announcements" 
}) 
public class SPOAnnouncement { 

    @JsonProperty("TileLevel") 
    private List<Object> tileLevel = null; 
    @JsonProperty("SystemLevel") 
    private List<SystemLevel> systemLevel = null; 
    @JsonProperty("Announcements") 
    private List<Announcement> announcements = null; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    @JsonProperty("TileLevel") 
    public List<Object> getTileLevel() { 
     return tileLevel; 
    } 

    @JsonProperty("TileLevel") 
    public void setTileLevel(List<Object> tileLevel) { 
     this.tileLevel = tileLevel; 
    } 

    @JsonProperty("SystemLevel") 
    public List<SystemLevel> getSystemLevel() { 
     return systemLevel; 
    } 

    @JsonProperty("SystemLevel") 
    public void setSystemLevel(List<SystemLevel> systemLevel) { 
     this.systemLevel = systemLevel; 
    } 

    @JsonProperty("Announcements") 
    public List<Announcement> getAnnouncements() { 
     return announcements; 
    } 

    @JsonProperty("Announcements") 
    public void setAnnouncements(List<Announcement> announcements) { 
     this.announcements = announcements; 
    } 

    @JsonAnyGetter 
    public Map<String, Object> getAdditionalProperties() { 
     return this.additionalProperties; 
    } 

    @JsonAnySetter 
    public void setAdditionalProperty(String name, Object value) { 
     this.additionalProperties.put(name, value); 
    } 

} 
-----------------------------------com.example.SystemLevel.java----------------------------------- 

package com.example; 

import java.util.HashMap; 
import java.util.Map; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
     "Title", 
     "Description", 
     "AnnouncementType", 
     "ActiveF", 
     "TileName" 
}) 
public class SystemLevel { 

    @JsonProperty("Title") 
    private String title; 
    @JsonProperty("Description") 
    private String description; 
    @JsonProperty("AnnouncementType") 
    private String announcementType; 
    @JsonProperty("ActiveF") 
    private Object activeF; 
    @JsonProperty("TileName") 
    private Object tileName; 
    @JsonIgnore 
    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 

    @JsonProperty("Title") 
    public String getTitle() { 
     return title; 
    } 

    @JsonProperty("Title") 
    public void setTitle(String title) { 
     this.title = title; 
    } 

    @JsonProperty("Description") 
    public String getDescription() { 
     return description; 
    } 

    @JsonProperty("Description") 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    @JsonProperty("AnnouncementType") 
    public String getAnnouncementType() { 
     return announcementType; 
    } 

    @JsonProperty("AnnouncementType") 
    public void setAnnouncementType(String announcementType) { 
     this.announcementType = announcementType; 
    } 

    @JsonProperty("ActiveF") 
    public Object getActiveF() { 
     return activeF; 
    } 

    @JsonProperty("ActiveF") 
    public void setActiveF(Object activeF) { 
     this.activeF = activeF; 
    } 

    @JsonProperty("TileName") 
    public Object getTileName() { 
     return tileName; 
    } 

    @JsonProperty("TileName") 
    public void setTileName(Object tileName) { 
     this.tileName = tileName; 
    } 

    @JsonAnyGetter 
    public Map<String, Object> getAdditionalProperties() { 
     return this.additionalProperties; 
    } 

    @JsonAnySetter 
    public void setAdditionalProperty(String name, Object value) { 
     this.additionalProperties.put(name, value); 
    } 

} 

记得要序列化这些,如果你正在创建一个web服务;)。