2012-11-07 48 views
5

Tôi có đối tượng Pojo, với hàm getAsJson để trả về chuỗi Json cho đối tượng này. Tôi sử dụng JsonProperty để xác định các thuộc tính json trong đối tượng này. Sử dụng writeValueAsString của ObjectMapper để viết chuỗi json cho đối tượng này.Thuộc tính json trùng lặp khi chuyển đổi đối tượng java thành chuỗi json bằng cách sử dụng jackson

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) ; 
    } 
} 

Bây giờ, tôi nhận được kết quả

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()); 
    } 

Nhưng tính chất lặp lại của kết quả:

{"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} 

Cho tôi xem những gì xảy ra trong của vấn đề này?

+0

Tôi nghĩ rằng đây có thể là câu trả lời: http://stackoverflow.com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferably-globally – pawelzieba

+0

oh, vâng, cảm ơn @pawelzieba đây là câu trả lời. – Sonrobby

Trả lời

11

Vì vậy, tôi làm theo: how to specify jackson to only use fields - preferably globally

tôi thêm

@JsonAutoDetect(fieldVisibility = Visibility.ANY, getterVisibility = Visibility.NONE, setterVisibility = Visibility.NONE) 

trước

public class LogLikeArticleDetail extends BaseObject 

và kết quả mà tôi muốn.

Vì vậy, có thể giải quyết khác mà trong getAsJson) chức năng (như:

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) ; 

Cám ơn câu hỏi @Sean Carpenter 's và @ kmb385 câu trả lời trong diễn đàn.

1

Bạn cũng có thể thực hiện việc này cho mỗi POJO bằng chú thích. Thêm chuỗi này để phía trên cùng của lớp học của bạn mà bạn muốn không phát hiện tự động vào lúc:

@JsonAutoDetect (fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility .NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE)

Ví dụ:

@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; 
    } 
} 

này sẽ trả lại các tài sản tôi đã xác định và không tự động phát hiện tên trường và thêm chúng vào kết quả JSON đã trả về của tôi.

Các vấn đề liên quan