Проблема JSON Objectmapper - PullRequest
       5

Проблема JSON Objectmapper

0 голосов
/ 12 июня 2018

Получение обоих java-объектов как и будет генерироваться jsonproperty, пока я преобразую java-объект в JSON.

VO-класс:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class FalconidePersonalizationVO {

private String recipient;

@JsonProperty("x-apiheader-cc")
private String xApiheaderCc;

@JsonProperty("x-apiheader")
private String xApiheader;

private List<FalconideAttachmentVO> attachments = null;

@JsonProperty("recipient_cc") 
private List<String> recipientCc = null;

public String getRecipient() {
    return recipient;
}

public void setRecipient(String recipient) {
    this.recipient = recipient;
}

public String getXApiheaderCc() {
    return xApiheaderCc;
}

public void setXApiheaderCc(String xApiheaderCc) {
    this.xApiheaderCc = xApiheaderCc;
}

public String getXApiheader() {
    return xApiheader;
}

public void setXApiheader(String xApiheader) {
    this.xApiheader = xApiheader;
}

public List<FalconideAttachmentVO> getAttachments() {
    return attachments;
}

public void setAttachments(List<FalconideAttachmentVO> attachments) {
    this.attachments = attachments;
}

public List<String> getRecipientCc() {
    return recipientCc;
}

public void setRecipientCc(List<String> recipientCc) {
    this.recipientCc = recipientCc;
}

/* (non-Javadoc)
 * @see java.lang.Object#toString()
 */
@Override
public String toString() {
    return "PersonalizationVO [recipient=" + recipient + ", xApiheaderCc=" + xApiheaderCc + ", xApiheader="
            + xApiheader + ", attachments=" + attachments + ", recipientCc=" + recipientCc + "]";
}

}

Основной класс:

  public class FalconideAPICall {

public static void main(String[] args) throws JsonGenerationException, JsonMappingException, IOException {
    try {
        FalconideEmailVO falconideEmail = new FalconideEmailVO();
        List<FalconidePersonalizationVO> personalizationList = new ArrayList<>();
        FalconidePersonalizationVO personalization = new FalconidePersonalizationVO();
        personalization.setRecipient("bharathi.senthilnathan@cognizant.com");
        personalization.setXApiheader("ABC1234");
        personalization.setXApiheaderCc("DEF1234");

        List<String> recipientCc= new ArrayList<>();
        recipientCc.add("XXXXX");
        personalization.setRecipientCc(recipientCc);

        personalizationList.add(personalization);

        falconideEmail.setPersonalizations(personalizationList);
        ObjectMapper mapperObj = new ObjectMapper();

             String jsonStr = mapperObj.writerWithDefaultPrettyPrinter().writeValueAsString(falconideEmail);
        System.out.println("jsonStr"+jsonStr);

}}

Вывод:

"personalizations" : [ {
"recipient" : "bharathi.senthilnathan@cognizant.com",
**"xapiheader" : "ABC1234",   Which should not come
"xapiheaderCc" : "DEF1234", Which should not come **
 **"x-apiheader-cc" : "DEF1234", xapiheader should come as x-apiheader-cc as I used @JSONProperty
"x-apiheader" : "ABC1234", xapiheader should come as x-apiheader-cc as I used @JSONProperty**
"recipient_cc" : [ "bharathi.senthilnathan@cognizant.com" ]
 } ]

Здесь xapiheader и xapiheaderCc должны быть преобразованы в JSON.В JSON должны быть только x-apiheader-cc и x-apiheader, поскольку я использовал @JSONProperty для xapiheader и xapiheaderCc.

Не могли бы вы подтвердить, где я допустил ошибку.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

**************** Решение 1 ****************

Аннотироватьgetter / setter с @JsonProperty (теперь аннотирование поля не является обязательным)

public class FalconidePersonalizationVO {

    @JsonProperty("x-apiheader-cc")
    private String xApiheaderCc;

    @JsonProperty("x-apiheader")
    private String xApiheader;

    @JsonProperty("x-apiheader-cc")
    public String getXApiheaderCc() {
        return xApiheaderCc;
    }

    @JsonProperty("x-apiheader-cc")
    public void setXApiheaderCc(String xApiheaderCc) {
        this.xApiheaderCc = xApiheaderCc;
    }

    @JsonProperty("x-apiheader")
    public String getXApiheader() {
        return xApiheader;
    }

    @JsonProperty("x-apiheader")
    public void setXApiheader(String xApiheader) {
        this.xApiheader = xApiheader;
    }
}   

**************** Solution 2 ****************

Следуйте правилам именования сеттеров / геттеров.В обычном соглашении об именах первая буква имени поля пишется с заглавной буквы с добавлением set / getНо в этом случае, поскольку второй символ является прописным, первый символ не пишется с большой буквы.См https://stackoverflow.com/a/16146215/3295987

public class FalconidePersonalizationVO {

    @JsonProperty("x-apiheader-cc")
    private String xApiheaderCc;

    @JsonProperty("x-apiheader")
    private String xApiheader;

    /*
     * Setter / getter auto generated in eclipse
     */
    // getXApiheaderCc -> getxApiheaderCc
    public String getxApiheaderCc() {
        return xApiheaderCc;
    }

    public void setxApiheaderCc(String xApiheaderCc) {
        this.xApiheaderCc = xApiheaderCc;
    }

    public String getxApiheader() {
        return xApiheader;
    }

    public void setxApiheader(String xApiheader) {
        this.xApiheader = xApiheader;
    }
}
0 голосов
/ 12 июня 2018

Добавьте @JsonAutoDetect(getterVisibility= JsonAutoDetect.Visibility.NONE) в свой класс:

@JsonAutoDetect(getterVisibility= JsonAutoDetect.Visibility.NONE)
@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class FalconidePersonalizationVO {

По умолчанию Джексон следует соглашению с Java-бином для вывода свойств json.В результате он находит ваш метод getX и выводит xapiheader свойство.

Но вы также аннотируете свое поле с помощью @JsonProperty, так что другое свойство с именем x-apiheader также отключается.

Отключение метода обнаружения getterX предотвратит поля получения выходных данных Джексона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...