2012-11-07 15 views
5

का उपयोग करते हुए जावा ऑब्जेक्ट को जेसन स्ट्रिंग में परिवर्तित करते समय डुप्लिकेट जेसन संपत्ति, मेरे पास Pojo ऑब्जेक्ट है, GetAsJson फ़ंक्शन को इस ऑब्जेक्ट के लिए जेसन स्ट्रिंग को वापस करने के लिए। मैं इस ऑब्जेक्ट में जेसन गुणों को परिभाषित करने के लिए जेसनप्रोपर्टी का उपयोग करता हूं। इस ऑब्जेक्ट के लिए जेसन स्ट्रिंग लिखने के लिए ऑब्जेक्टमैपर के लेखन ValueAsString का उपयोग करें।जैकसन

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} 

मुझे दिखाओ क्या इस समस्या में होते हैं?

+0

मुझे लगता है कि यह उत्तर हो सकता है: http://stackoverflow.com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferably-globally – pawelzieba

+0

ओह, हाँ, धन्यवाद @ pawelzieba यह जवाब है। – Sonrobby

उत्तर

11

तो मैं का पालन करें: how to specify jackson to only use fields - preferably globally

मैंने पहले

public class LogLikeArticleDetail extends BaseObject 

और नतीजा यह है कि मैं चाहता हूँ

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

जोड़ें।

तो एक और हल कर सकते हैं कि 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 बढ़ई के प्रश्न के लिए और @ ऊपर के लिंक में kmb385 जवाब धन्यवाद।

1

आप एनोटेशन का उपयोग करके प्रति 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 परिणाम में जोड़ता है।