使用jackson将java对象转换为json字符串时重复的json属性
我有Pojo对象,使用getAsJson函数返回此对象的Json字符串。 我使用JsonProperty来定义此对象中的json属性。 使用ObjectMapper的writeValueAsString为此对象编写json字符串。
import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; @JsonIgnoreProperties(ignoreUnknown=true) public class LogLikeArticleDetail extends BaseObject { private static final long serialVersionUID = -2018373118257019033L; @JsonProperty("LikeArticleGUId") private String likeArticleGUId; @JsonProperty("UserId") private String userID; @JsonProperty("UserName") private String userName; @JsonProperty("IP") private String ip; @JsonProperty("OS") private String os; @JsonProperty("UserAgent") private String userAgent; @JsonProperty("WebsiteCode") private String websiteCode; @JsonProperty("ArticleId") private String articleID; @JsonProperty("ATitle") private String aTitle; @JsonProperty("CateAlias") private String cateAlias; @JsonProperty("LikeStatus") private String likeStatus; @JsonProperty("TimeStamp") private Date timeStamp; //get, set.... //.... @JsonIgnore public String getAsJSON() throws JsonGenerationException, JsonMappingException, IOException{ ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(this) ; } }
现在,我得到了结果
public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException { Calendar calendar = Calendar.getInstance(); LogLikeArticleDetail logLikeArticle = new LogLikeArticleDetail("1","2","3","4","5","6","7","8","what thing \"nothing\" show","10","11",calendar.getTime()); System.out.println(logLikeArticle.getAsJSON()); }
但结果是重复的属性:
{"LikeArticleGUId":"1","UserId":"2","UserName":"3","IP":"4","OS":"5","UserAgent":"6","WebsiteCode":"7","ArticleId":"8","ATitle":"what thing \"nothing\" show","CateAlias":"10","LikeStatus":"11","TimeStamp":1352256727062,"_likeArticleGUId":"1","websiteCode":"7","likeStatus":"11","userID":"2","userName":"3","ip":"4","os":"5","userAgent":"6","articleID":"8","aTitle":"what thing \"nothing\" show","cateAlias":"10","timeStamp":1352256727062}
告诉我这个问题发生了什么?
所以我遵循: 如何指定jackson只使用字段 – 最好全局
我加
@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE)
之前
public class LogLikeArticleDetail extends BaseObject
和我想要的结果。
那么另一个解决方案可以在getAsJson()函数中解决:
ObjectMapper mapper = new ObjectMapper(); mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker() .withFieldVisibility(JsonAutoDetect.Visibility.ANY) .withGetterVisibility(JsonAutoDetect.Visibility.NONE) .withSetterVisibility(JsonAutoDetect.Visibility.NONE) .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); return mapper.writeValueAsString(this) ;
感谢@Sean Carpenter的问题以及上面链接中的@kmb385回答。
您也可以使用注释为每个POJO执行此操作。 将此字符串添加到您不希望自动检测的类的顶部:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY,getterVisibility = JsonAutoDetect.Visibility.NONE,setterVisibility = JsonAutoDetect.Visibility.NONE,creatorVisibility = JsonAutoDetect.Visibility.NONE)
例如:
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE, setterVisibility=JsonAutoDetect.Visibility.NONE, creatorVisibility=JsonAutoDetect.Visibility.NONE) class Play { @JsonProperty("Name") private String name; @JsonProperty("NickName") private String nickName; public Play(){ } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } }
这将返回我定义的属性,而不是自动检测字段名称并将它们添加到我返回的JSON结果中。
我们也可以直接在getter上使用@JsonProperty(“Name”)注释来避免重复。