如何防止使用Eclipse Yasson输出空字符串和空集合

时间:2019-08-29 12:19:34

标签: java json jsonb-api yasson

我们想为某些Java对象创建一个json字符串,但是我们不希望将空字符串或空数组添加到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"}

1 个答案:

答案 0 :(得分:1)

我已经检查了文档和代码,var body: some View { List { ForEach(messages, id: \.self) { Text($0.avatar) Text($0.message) } } } 仅提供了一个忽略空值的选项(默认情况下处于激活状态)。

Yasson

唯一的选择似乎是为JsonbConfig config = new JsonbConfig().withNullValues(false); Jsonb jsonb = JsonbBuilder.create(config); 类实现自定义JsonbSerializer,并且在该值为空时不对字段进行序列化。

Person

并使用以下代码初始化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