Как я могу предотвратить вывод пустых строк и пустых коллекций с помощью Elipse Yasson?

Мы хотим создать строку json для некоторых объектов Java, но не хотим, чтобы в вывод json добавлялись пустые строки или пустые массивы. Мы используем Eclipse Yasson 1.0.1 для создания строк json.

На самом деле то, что мы хотим, это поведение JsonInclude.Include.NON_EMPTY Джексона, но мы не можем использовать Джексона.

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    private int id;

    private String name;

    private String email;

    private String birthPlace;

    private List<String> phones;
}

public class Test {
    public static void main(String[] args) {
        Jsonb jsonb = JsonbBuilder.create();

        Person person = Person.builder()
                .id(1)
                .name("Gert")
                .email("") //Should not be in output -> nok
                .birthPlace(null) //Should not be in output -> ok
                .phones(new ArrayList<>()) //Should not be in output -> nok
                .build();

        String toJsonString = jsonb.toJson(person);

        System.out.println(toJsonString);
    }
}

Токовый выход

{"email":"","id":1,"name":"Gert","phones":[]}

Но мы хотим, чтобы это было

{"id":1,"name":"Gert"}

0 ответов

Я проверил документацию и код, и Yasson предоставляют только возможность игнорировать нулевые значения (которая активирована по умолчанию).

JsonbConfig config = new JsonbConfig().withNullValues(false);
Jsonb jsonb = JsonbBuilder.create(config);

Кажется, единственный вариант - реализовать собственный JsonbSerializer для тебя Person class, а не сериализовать поле, когда значение пусто.

public class PersonSerializer implements JsonbSerializer<Person> {
    @Override
    public void serialize(Person person, JsonGenerator generator, SerializationContext serializationContext) {
        generator.writeStartObject();
        generator.write("id", person.getId());
        if (person.getName() != null && !person.getName().isEmpty()) {
            generator.write("name", person.getName());
        }
        if (person.getEmail() != null && !person.getEmail().isEmpty()) {
            generator.write("email", person.getEmail());
        }
        // ...
        generator.writeEnd();
    }
}

И инициализировать Yasson со следующим кодом:

JsonbConfig config = new JsonbConfig().withSerializers(new PersonSerializer());
Jsonb jsonb = JsonbBuilder.create(config);
Другие вопросы по тегам