2012-11-07 14 views
5

Ich habe Pojo-Objekt, mit GetAsJson-Funktion, um JSON-String für dieses Objekt zurückzugeben. Ich verwende JsonProperty, um JSON-Eigenschaften in diesem Objekt zu definieren. Verwenden Sie writeValueAsString von ObjectMapper, um eine JSON-Zeichenfolge für dieses Objekt zu schreiben.Doppelte json-Eigenschaft beim Konvertieren von Java-Objekt in JSON-String mit Hilfe von 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) ; 
    } 
} 

Nun bekomme ich

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

führen Aber die duplizierten Eigenschaften Ergebnis:

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

Zeig mir, was ist in diesem Problem auf?

+0

Ich denke, das könnte die Antwort sein: http://StackOverflow.com/Questions/7105745/How-to-Specify-Jackson-To-only-use-Fields-Prevailable-Globally – pawelzieba

+0

oh, ja, danke @pawelzieba Das ist die Antwort. – Sonrobby

Antwort

11

So folgen i do: how to specify jackson to only use fields - preferably globally

ich hinzufügen

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

vor

public class LogLikeArticleDetail extends BaseObject 

und das Ergebnis, das ich will.

So kann eine andere lösen, dass in getAsJson() Funktion wie:

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

Dank für @Sean Carpenter ‚s Frage und @ kmb385 Antwort in Verbindung oben.

1

Sie können dies auch per POJO mithilfe von Anmerkungen tun. Fügen Sie diese Zeichenfolge an die Spitze Ihrer Klasse haben Sie keine automatische Erkennung möchten auf:

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

Zum Beispiel:

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

Dadurch werden die Eigenschaften zurückkehren I‘ Ich habe die Feldnamen definiert und nicht automatisch erkannt und sie zu meinem zurückgegebenen JSON-Ergebnis hinzugefügt.

Verwandte Themen