0
votes

La conversion POJO en JSON ne fonctionne pas pour la variable String commençant par "is"

La variable de chaîne - "isInitial" dans l'exemple ci-dessous n'est pas convertie en JSON. Est-il possible de générer une structure JSON pour la variable isInitial sans modifier la classe EmployeePOJO ?

PS: la conversion de la méthode getter en getIsInitial fonctionne.

Veuillez trouver ci-dessous la classe POJO utilisée pour générer le JSON:

import org.codehaus.jackson.map.ObjectMapper;

import java.io.IOException;

public class JacksonPojoToJson {
    public static void main(String[] args) throws IOException {
        // Create ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        EmployeePOJO employeePOJO = new EmployeePOJO();
        employeePOJO.setFirstName("FIRST NAME");
        employeePOJO.setFirstNameAvailable(true);
        employeePOJO.setLastName("last name");
        employeePOJO.setHasLastNameAvailable(true);
        employeePOJO.setInitial("true");

        // Convert object to JSON string
        String json = mapper.writeValueAsString(employeePOJO);
        System.out.println(json);
    }
}

Veuillez trouver ci-dessous la logique principale de la conversion POJO:

public class EmployeePOJO {
    private String firstName;
    private String lastName;
    private String isInitial;
    private boolean isFirstNameAvailable;
    private boolean hasLastNameAvailable;
    private String hasHouse;


    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String isInitial()
    {
        return this.isInitial;
    }

    public void setInitial(String pInitial)
    {
        this.isInitial = pInitial;
    }

    public String getHasHouse() {
        return hasHouse;
    }

    public void setHasHouse(String hasHouse) {
        this.hasHouse = hasHouse;
    }

    public boolean isFirstNameAvailable() {
        return isFirstNameAvailable;
    }

    public void setFirstNameAvailable(boolean firstNameAvailable) {
        isFirstNameAvailable = firstNameAvailable;
    }

    public boolean isHasLastNameAvailable() {
        return hasLastNameAvailable;
    }

    public void setHasLastNameAvailable(boolean hasLastNameAvailable) {
        this.hasLastNameAvailable = hasLastNameAvailable;
    }
}


4 commentaires

Avez-vous essayé de changer la valeur de setInitial, peut-être ajouter un espace comme "true" ou "true"?


Quel est le résultat attendu et actuel?


@AndreiTigau - selon ce que je comprends, les méthodes setter ne sont pas appelées pendant la sérialisation, seules les méthodes getter sont appelées.


@lealceldeiro - Je voudrais que la valeur initiale soit définie dans le pojo pour la partie du JSON. Dans ce cas "initial": "vrai"


6 Réponses :


0
votes

La raison en est que les setters / getters pour les variables boolean ne suivent pas le modèle setVariableName / getVariableName .

Vous pouvez voir dans votre propre code que c'est comme ça:

public String isInitial()
{
    return this.isInitial;
}

public void setInitial(String isInitial)
{
    this.isInitial = isInitial;
}

Une solution rapide serait de créer manuellement les setters / getters pour les variables booléennes. Ce (problème de création de setter / getter) se produit généralement dans eclipse, mais je pense qu'IntelliJ gère ce droit.


0 commentaires

3
votes

Mauvaises conventions de dénomination. Si vous utilisez l'EDI, laissez l'EDI générer les getters et les setters pour vous.

La méthode isInitial peut être utilisée comme getter pour une variable booléenne. Pas une variable String.

Vous pouvez donc corriger votre classe POJO ( https://en.wikipedia.org/wiki/Plain_old_Java_object )

ou vous pouvez utiliser l'annotation @JsonProperty ( https://fasterxml.github.io/jackson-annotations/javadoc/2.8/com/fasterxml/jackson/annotation/JsonProperty.html )


1 commentaires

Merci beaucoup pour la suggestion @JsonProperty, cela a bien fonctionné. Je cherchais une solution sans modifier la classe - EmployeePOJO. J'ai résolu ce problème en utilisant Mixins - leveluplunch.com/java/tutorials/… et medium.com/@shankar.ganesh.1234/… sont de bons exemples d'utilisation. Exemple de code qui a fonctionné pour moi: interface publique EmployeePOJOMixIn {@JsonProperty ("isInitial") public abstract String isInitial (); } Ensuite, ajoutez ce Mixin au mappeur.



1
votes

Utilisez la dépendance Lombok maven pour générer un getter et un setter automatiques.


0 commentaires

0
votes

Vous devez utiliser le nom correct des getters et des setters pour votre variable par exemple:

private String isInitial;

Pour la variable ci-dessus, le setter getter doit être:

public String getIsInitial()
{
    return this.isInitial;
}

public void setIsInitial(String isInitial)
{
    this.isInitial = isInitial;
}

Remarque: je ne connais pas votre cas d'utilisation mais un nom comme isXXXX est utilisé pour les getters de variables booléennes.


0 commentaires

0
votes

Je recommanderais d'utiliser les annotations @Getter et @Setter de Lombok pour générer automatiquement vos méthodes getter et setter. En les utilisant, vous ne rencontrerez pas de problèmes avec les conventions de dénomination, etc.

Veuillez consulter l'URL suivante pour plus d'informations: https://projectlombok.org/features/GetterSetter


0 commentaires

0
votes

@Loizos - Merci beaucoup pour la suggestion @JsonProperty , cela a bien fonctionné. Je cherchais une solution sans modifier la classe - EmployeePOJO (puisque c'est du code hérité que nous ne voulons pas toucher).

J'ai résolu ce problème en utilisant Mixins, qui ne nécessite pas de modification dans le fichier EmployeePOJO.

Exemple de code qui a fonctionné pour moi:

public interface EmployeePOJOMixIn {

    @JsonProperty("isInitial")
    public abstract String isInitial();
}

Ajoutez ensuite ce Mixin au mappeur ( cela variera selon que vous utilisez plus rapidexml ou codehaus )

https://www.leveluplunch.com/java/tutorials/024-modifying-fields-external-domain-jackson-mixin/ et https://medium.com/@shankar.ganesh.1234/jackson-mixin-a- guide-simple-vers-une-fonction-puissante-d984341dc9e2 sont de bons sites auxquels j'ai fait référence pour la solution.


0 commentaires