首页 > 解决方案 > Quarkus REST 客户端避免空字段的 JSON 序列化

问题描述

我需要在远程服务上发送更新请求以更新某些字段。远程服务使用application/json内容类型,所以我实现了我的休息客户端,如:

@RegisterRestClient
@Path("/api/v1")
@Produces("application/json")
@Consumes("application/json")
@ApplicationScoped
public interface ServiceClient {
    @POST
    @Path("/path_to_update/{uuid}")
    Response updateAttributes(
        @PathParam("uuid") String uuid,
        Attributes attributes
    );
}


@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class Attributes {
    private AttributesA a;
    private AttributesB b;
}

@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class AttributesA {
    private String field1;
}

@NoArgsConstructor
@Data
@AllArgsConstructor
@Builder
public class AttributesB {
    private String field2;
    private String field3;
}

我只需要更新字段的一个子集。也许field1field3。所以在这种情况下field2将被设置为null

远程服务不接受 anull作为参数值,因此我需要避免序列化所有具有null值的字段。

我的项目使用jsonb并且我已经尝试注释模型类JsonbNillable但没有任何成功。

是否有办法配置其余客户端以避免空字段的序列化?

标签: javajsonserializationquarkusjsonb-api

解决方案


我建议将 Lombok 用于您的数据类,以便在事情没有按预期工作时更加清晰。在这种情况下,您实际上可以使用 JSON-B 的默认可见性策略在没有 lombok 的情况下更简洁地编写代码,这意味着公共字段会自动 [de] serailized 并且不需要具有 getter/setter。

所以你的数据类可能是:

public class Attributes {
    public AttributesA a;
    public AttributesB b;
}

public class AttributesA {
    public String field1;
}

public class AttributesB {
    public String field2;
    public String field3;
}

有没有办法配置其余客户端以避免空字段的序列化?

默认情况下 JSON-B 不会序列化空值。所以如果我们这样做:

Attributes empty = new Attributes();
String json = jsonb.toJson(empty);
System.out.println(json); // "{}"

我们只会得到一个空的 JSON 对象{}@JsonbNillable如果您确实想将空值序列化为null.


推荐阅读