14

このオブジェクトのJson文字列を返すgetAsJson関数を使用したPojoオブジェクトがあります。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}

この問題で何が起こっているのか見せてください。

4

4 に答える 4

25

だから私は従います: フィールドのみを使用するように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) ;

上記のリンクにある@SeanCarpenterの質問と@kmb385の回答に感謝します。

于 2012-11-09T07:54:31.317 に答える
6

注釈を使用して、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結果に追加されます。

于 2016-11-28T11:11:39.497 に答える
5

重複を避けるために、ゲッターで直接@JsonProperty( "Name")アノテーションを使用することもできます。

于 2018-08-29T11:35:50.283 に答える
2

実際には問題ではありません。したがって、ここで起こったのは、Jacksonライブラリがこれらのフィールドを自動的に一致させることができなかったため(大文字と小文字が統一されているという仮定はありません)、期待する2倍のプロパティになります。

この問題の簡単な修正は、ゲッター/セッターのいずれかに注釈を追加することです(どちらでも構いません)。

@JsonProperty("UserName")
public String getUserName() {
        return this.userName;
}

この問題は、JacksonGithubリポジトリでも発生しました。次のリンクで答えを見つけることができます。

https://github.com/FasterXML/jackson-databind/issues/1609

于 2020-05-07T07:13:59.073 に答える