Vertx 4.5.11中Jackson解析空JSON对象被吞的配置方案咨询
Vert.x-Web中保留空JSON数组/对象的Jackson配置方案
问题场景
使用Vert.x版本4.5.11,控制器代码配置了Jackson的DatabindCodec,设置了Include.NON_EMPTY序列化规则,但出现以下异常情况:
- 请求JSON中的空数组(如
weNr: [])在解析后序列化输出时会丢失; - 仅包含空数组的对象字段(如
data: {"weNr": []})会被整体丢弃; - 只有数组含有效值或对象包含其他非空字段时,对应内容才会被保留。
控制器代码
var mapper = DatabindCodec.mapper(); mapper.configure( SerializationFeature.FAIL_ON_EMPTY_BEANS, false ); mapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false ); mapper.setSerializationInclusion( Include.NON_EMPTY ); // ... router.patch( "/my" ).consumes( JSON ).produces( JSON ).blockingHandler( this::validate ); // ... void validate( RoutingContext rc ) { JsonObject json = rc.body().asJsonObject(); log.info( "validate {} >> {}", rc.body().asString(), json ); }
测试案例1:仅含空数组的对象
请求JSON:
{ "object": { "name": "aaa", "data": { "weNr": [] } } }
日志输出:
validate {"object":{"name":"aaa","data":{"weNr":[]}}} >> {"object":{"name":"aaa"}}}
测试案例2:含非空数组的对象
请求JSON:
{ "object": { "name": "aaa", "data": { "weNr": [9410] } } }
日志输出:
validate {"object":{"name":"aaa","data":{"weNr":[9410]}}} >> {"object":{"name":"aaa","data":{"weNr":[9410]}}}
测试案例3:含空数组+非空字段的对象
请求JSON:
{ "object": { "name": "aaa", "data": { "weNr": [], "boo":"far" } } }
日志输出:
validate {"object":{"name":"aaa","data":{"weNr":[],"boo":"far"}}} >> {"object":{"name":"aaa","data":{"boo":"far"}}}
解决方案
问题根源是Include.NON_EMPTY规则会排除空数组、空集合等"空内容",以及仅包含空内容的对象。要保留空数组和对应对象,需调整Jackson的序列化包含规则:
方案1:替换为NON_NULL规则(推荐)
将Include.NON_EMPTY替换为Include.NON_NULL,仅排除null值,空数组、空对象等非null的空内容会被保留:
var mapper = DatabindCodec.mapper(); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 替换为NON_NULL,保留空数组、空对象 mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
方案2:精细控制不同类型的包含规则
如果需要针对不同类型设置差异化规则(比如保留空数组,但排除空字符串),可以使用JsonInclude.Value组合规则:
var mapper = DatabindCodec.mapper(); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 全局非null值保留,数组类型始终保留(包括空数组) JsonInclude.Value includeConfig = JsonInclude.Value.construct( JsonInclude.Include.NON_NULL, JsonInclude.Include.ALWAYS ); mapper.setSerializationInclusion(includeConfig);
关键说明
DatabindCodec.mapper()是Vert.x全局的Jackson ObjectMapper实例,修改其配置会影响整个应用的JSON序列化/反序列化行为;- 若仅需针对特定路由或请求调整规则,可创建独立的ObjectMapper实例,而非修改全局mapper。
内容的提问来源于stack exchange,提问作者injecteer
相关产品推荐
相关产品推荐

