Почему пользовательские @Exclude не исключают поля из сериализации - PullRequest
0 голосов
/ 27 апреля 2020

Мне нужно исключить указанные c поля при сериализации / десериализации объекта до json.

Я создаю свою пользовательскую аннотацию:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Exclude {}

Использование:

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.Set;

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Exclude
    private int id;
    @NotNull
    @Exclude
    private String name;

А здесь Gson сериализует:

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
JsonObject json = new JsonObject();
    json.addProperty("user_name", currentUserName);
    Product product = productEntry.getProduct();
    json.addProperty("product", GsonUtil.gson.toJson(product));
    json.addProperty("quantity", productEntry.getQuantity());
    logger.info("addProductToCart: json = " + json);

и вот результат:

addProductToCart: json = {"user_name":"admin@admin.com","product":"{\"id\":0,\"name\":\"My product 1\",\"description\":\"\",\"created\":\"Apr 27, 2020, 4:53:34 PM\",\"price\":1.0,\"currency\":\"USD\",\"images\":[\"url_1\",\"url_2\"]}","quantity":1}

Почему поля id, имя не исключаются из json?

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

вам может понадобиться написать свой собственный json сериализатор для этого следующим образом:

class ExcludeFieldsSerializer extends JsonSerializer<Bean> {

@Override
public void serialize(final Bean value, final JsonGenerator gen, final SerializerProvider serializer) throws IOException, JsonProcessingException {
    gen.writeStartObject();
    try {
        for (final Field aField : Bean.class.getFields()) {
            if (f.isAnnotationPresent(Ignore.class)) {
                gen.writeStringField(aField.getName(), (String) aField.get(value));
            }
        }
    } catch (final Exception e) {

    }
    gen.writeEndObject();
}

}

используйте ваш объект сопоставления для регистрации того же

Однако Вы также можете использовать существующие аннотации как

@Expose (serialize = false, deserialize = false)

Здесь, если serialize равно true, помеченное поле записывается в JSON во время сериализации.

, если deserialize равно true, поле, помеченное как hen десериализуется из JSON. и

Gson gson = new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .create();

Позже вы можете сделать gson.to Json (product)

Редактировать: если объект Gson создается как новый Gson () и если мы пытаемся выполнить to * Методы 1023 * () и Json (), тогда @Expose не влияют на сериализацию и десериализацию.

0 голосов
/ 27 апреля 2020

Я нашел решение:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Exclude {}

и когда init gson:

publi c class GsonUtil {

  public static GsonBuilder gsonbuilder = new GsonBuilder();
    public static Gson gson;
    public static JsonParser parser = new JsonParser();

    static {
        // @Expose -> to exclude specific field when serialize/deserilaize
        gsonbuilder.addSerializationExclusionStrategy(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes field) {
                return field.getAnnotation(Exclude.class) != null;
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        });
        gson = gsonbuilder.create();
    }
}

Использование:

@Entity
    public class Product {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Exclude
        private int id;

и теперь успех ИСКЛЮЧИТЕ поле c.

0 голосов
/ 27 апреля 2020

Gson понимает @Expose(serialize = false) аннотацию,

import com.google.gson.annotations.Expose;

    @Expose(serialize = false)
    private int id;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...