2 votes

De Java à JSON : spécifier les champs exclus pour chaque conversion

Comme indiqué aquí Je sais que je peux convertir des objets Java en JSON (avec Jackson).

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(objectToBeConverted);

Je sais que je peux exclure des champs de la chaîne JSON à l'aide de l'attribut @JsonIgnore mais que faire si je veux convertir la même classe en JSON plusieurs fois, mais en choisissant à chaque fois des champs différents à ignorer ?

Par exemple, si j'ai une classe

class Foo {
    int a;
    int b;
    ...
}

Je peux faire quelque chose comme

Foo foo = new Foo();
String json1 = ow.writeValueAsString(foo).excludeField('b');
String json2 = ow.writeValueAsString(foo).excludeField('a');

de sorte que les chaînes de caractères résultantes ressemblent à

// json1
{
    a: 1234
}

// json2
{
    b: 5678
}

Si Jackson ne peut pas le faire, peut-être que Gson le pourra ? Ou une autre bibliothèque ?

1voto

Rob Spoor Points 166

Vous pouvez essayer d'utiliser différentes interfaces de mixage. J'ai trouvé deux façons de le faire.

  1. Utilisez les méthodes de lecture des propriétés. Vous pouvez ensuite créer une classe mix-in qui ne définit que les propriétés à exclure :

    public interface ExludeA {
        @JsonIgnore
        int getA();
    }
  2. Utilisez @JsonIncludeProperties de ne pas dire quelles propriétés exclure mais quelles propriétés pour inclure :

    @JsonIncludeProperties({ "b", "c" })
    public interface ExludeA {
    }

Dans les deux cas, ajoutez ce mix-in au mappeur d'objets :

objectMapper.addMixIn(Foo.class, ExcludeA.class);

Il y a une chose très, très importante cependant - vous devez utiliser une nouvelle ObjectMapper pour chaque mélange. Si vous utilisez un ObjectMapper pour sérialiser une Foo sans mélange, alors l'ajout du mélange n'aidera pas. C'est probablement parce que ObjectMapper les instances mettent en cache certaines choses.

0voto

Mehdi Rahimi Points 369

Il existe plusieurs solutions en fonction de vos besoins :

D'abord :
Vous pouvez simplement définir deux DTO pour votre objectif et chaque fois que vous avez besoin de chacun d'eux, utilisez-les.


Deuxièmement :
Vous pouvez utiliser @JsonInclude(JsonInclude.Include.NON_NULL) pour les propriétés :

class Foo {

    @JsonInclude(JsonInclude.Include.NON_NULL)
    int a;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    int b;
}

P.S : Vous pouvez utiliser cette annotation au niveau de la classe comme :

@JsonInclude(JsonInclude.Include.NON_NULL) 
class Foo {
    int a;
    int b;
}

Troisièmement :
Vous pouvez définir un filtre pour ignorer les propriétés en fonction de différentes conditions.

Définissez une classe simple pour votre filtre :

public class YourConditionalFilter {

    @Override
    public boolean equals(int a) {
        return a == 1234;
    }
}

Et ensuite ajouter ce filtre comme annotation au dessus de la propriété :

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = YourConditionalFilter.class)
int a;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X