java - 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;
}
我只需要更新字段的一个子集。也许field1
和field3
。所以在这种情况下field2
将被设置为null
。
远程服务不接受 anull
作为参数值,因此我需要避免序列化所有具有null
值的字段。
我的项目使用jsonb
并且我已经尝试注释模型类JsonbNillable
但没有任何成功。
是否有办法配置其余客户端以避免空字段的序列化?
解决方案
我建议将 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
.
推荐阅读
- ajax - Laravel CRUD Ajax 编辑:在下拉列表中显示选定的值
- c++ - 在 firefox.exe 中的 0x00007FFAF6BC72A6 (ntdll.dll) 处引发 libcurl 静态异常:0xC0000005:访问冲突写入位置 0x0000000000000024
- c++ - 非静态的 C++ 模板变量
- rust - 编辑 RefCell 关闭
- pandas - 向量化应用(列表)并在熊猫数据框中爆炸
- python - Pandas.DataFrame:如何按每行中的最大值对行进行排序
- r - 将温度数据添加到 R 中的另一个数据框
- rust - 在编译时将对象添加到数组的宏?
- opencv3.0 - 为什么 cv.waitKey(0) 直到按下键才暂停执行?
- sql - 在没有连接的情况下从 SQL 中的多个表中进行选择