2012-11-07 19 views
5

Mam obiekt Pojo, z funkcją getAsJson zwracającą ciąg Json dla tego obiektu. Używam JsonProperty do definiowania właściwości json w tym obiekcie. Użyj writeValueAsString z ObjectMapper, aby napisać ciąg json dla tego obiektu.Powielona właściwość json podczas konwertowania obiektu java na ciąg json za pomocą jacksona

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

Teraz mogę uzyskać wynik

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

Ale zduplikowane właściwości wynikiem jest:

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

Pokaż mi, co się pojawić w tym problemie?

+0

Myślę, że to może być odpowiedź: http://stackoverflow.com/questions/7105745/how-to-specify-jackson-to-only-use-fields-preferably-globally – pawelzieba

+0

oh, tak, dziękuję @ pawelzieba to jest odpowiedź. – Sonrobby

Odpowiedz

11

Więc wykonuj: how to specify jackson to only use fields - preferably globally

dodam

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

przed

public class LogLikeArticleDetail extends BaseObject 

i powoduje, że chcę.

Więc może innym rozwiązaniu, które w getAsJson function() jak:

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

Dzięki za pytanie @Sean Carpenter „s @ kmb385 i odpowiedzi w linku powyżej.

1

Możesz to również zrobić z POJO, korzystając z adnotacji. Dodaj ten ciąg do góry klasy chcesz na nie wykrycie auto:

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

Na przykład:

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

powoduje przywrócenie właściwości I” ve zdefiniowane i nie wykrywa automatycznie nazw pól i dodaje je do mojego zwróconego wyniku JSON.

Powiązane problemy