我们想为某些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"}
答案 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