java - 如何防止 eclipse Yasson 输出空字符串和空集合

标签 java json jsonb-api yasson

我们想要为某些 Java 对象创建一个 json 字符串,但我们不希望将空字符串或空数组添加到 json 输出中。我们使用 Eclipse Yasson 1.0.1 来创建 json 字符串。

其实我们想要的是Jackson的JsonInclude.Include.NON_EMPTY的行为,但是我们不能使用Jackson。

@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"}

最佳答案

我检查了文档和代码,Yasson只提供了忽略空值的选项(默认激活)。

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

唯一的选择似乎是为您的 Person 类实现自定义 JsonbSerializer,并且在值为空时不序列化字段。

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);

关于java - 如何防止 eclipse Yasson 输出空字符串和空集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57710065/

相关文章:

java - 查询解析器构建用于过滤内存中 Bean 的谓词

java - JBoss 7 应用程序,从 ui 启动/停止?

javascript - 有 Angular 。如何将 json 响应转换为 jsonp 响应?

c++ - 二进制数据 JSONCPP

java - JSON-B REST 负载验证

java - @Pattern with Unicode script\\p{L}* 不起作用

Android 9 上的 java.lang.IllegalStateException

json - 如何使用 UrlFetchApp 服务发送 JSON 负载?

java - 寻找枚举反/序列化过程中这种奇怪行为的解释