You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:30:03