jsonb 1.0 / eclipse yasson игнорирует приватные свойства без методов доступа к bean-компонентам - PullRequest
0 голосов
/ 06 февраля 2019

Согласно официальному руководству пользователя, http://json -b.net / users-guide.html , движок должен сериализовать любые найденные им свойства с использованием методов доступа к компонентам или без них (Я понимаю, что в примере с Dog используются открытые поля, но см. Пример Person для личных полей).

С учетом этих классов:

public class Rectangle {
    private double length1 = 0.0;
    @JsonbProperty("length2")
    private double length2 = 0.0;
    public double width = 0.0;
}

public class Rectangle2 {
    @JsonbProperty
    private double length = 0.0;

    private double width = 0.0;

    public double getLength() {
        return length;
    }

    public double getWidth() {
        return width;
    }
}

Когда я сериализую его так, как это:

public class App2 {
    public static void main(String... argv) {
        Jsonb jsonb = JsonbBuilder.create();

        System.out.println("Rectangle: " + jsonb.toJson(new Rectangle()));
        System.out.println("Rectangle2: " + jsonb.toJson(new Rectangle2()));
    }
}

Вывод таков:

Rectangle: {"width":0.0}
Rectangle2: {"length":0.0,"width":0.0}

В Rectangle я вижу только сериализацию, потому что она общедоступна.length1 и length2 игнорируются, поскольку они являются частными, даже если для length2 существует аннотация свойства.Rectangle2 полностью сериализован, так как имеет методы bean-компонентов.

Должен ли он быть таким?Требование, чтобы я сделал все поля открытыми и изменяемыми для включения сериализации, кажется огромным ограничением.

Мои зависимости настроены так:

    <dependency>
        <groupId>javax.json.bind</groupId>
        <artifactId>javax.json.bind-api</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>org.eclipse</groupId>
        <artifactId>yasson</artifactId>
        <version>1.0.2</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.json</artifactId>
        <version>1.1.4</version>
    </dependency>

1 Ответ

0 голосов
/ 06 февраля 2019

Я нашел эту ссылку о спецификации и видимости поля в источнике yasson (org.eclipse.yasson.internal.model.PropertyValuePropagation.DefaultVisibilityStrategy):

    @Override
    public boolean isVisible(Field field) {
        //don't check field if getter is not visible (forced by spec)
        if (method != null && !isVisible(method)) {
            return false;
        }
        return Modifier.isPublic(field.getModifiers());
    }

Я не могу говорить со спецификацией, но это сочетается с тем, что я видел - поля будут сериализованы только на основе видимости метода get.

Я хочу, чтобы моя сериализация управлялась исключительно полями, и только поля, которые я хочу сериализовать- поэтому я пошел с пользовательским PropertyVisibilityStrategy, который не предоставляет никаких методов, а только поля с аннотацией JsonbProperty.Это дает мне большую часть того, что я хочу:

    Jsonb jsonb = JsonbBuilder.newBuilder().withConfig(
        new JsonbConfig().withPropertyVisibilityStrategy(new PropertyVisibilityStrategy() {
            @Override
            public boolean isVisible(Field field) {
                return field.getAnnotation(JsonbProperty.class) != null;
            }

            @Override
            public boolean isVisible(Method method) {
                return false;
            }
        })
    ).build();
...