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

OpenAPI生成客户端:让Jackson ObjectMapper透传字节数组的方法

解决ObjectMapper透传原始字节数组的问题

你的核心问题是ObjectMapper默认会将输入的字节数组当作JSON内容解析,但图片的原始字节并非合法JSON格式,导致解析报错。要在必须使用ObjectMapper的约束下实现字节数组透传,可以通过自定义字节数组反序列化器绕过JSON解析逻辑,直接返回原始字节。

实现步骤

  1. 编写自定义反序列化器
    创建一个继承自JsonDeserializer<byte[]>的类,直接从输入流读取所有原始字节,不做任何JSON解析:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;

public class RawByteArrayDeserializer extends JsonDeserializer<byte[]> {
    @Override
    public byte[] deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 直接读取输入流的全部原始字节
        return p.getBinaryValue();
    }
}
  1. 配置ObjectMapper
    将自定义反序列化器注册到ObjectMapper中,覆盖默认的byte[]解析逻辑:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import java.util.Arrays;

public class TestByteTransmission {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        // 注册自定义反序列化器到byte[]类型
        module.addDeserializer(byte[].class, new RawByteArrayDeserializer());
        objectMapper.registerModule(module);

        // 测试验证
        byte[] originalByteArray = HexFormat.of().parseHex("e04fd020ea3a6910a2d808002b30309d");
        byte[] byteArray = objectMapper.readValue(originalByteArray, byte[].class);
        
        // 输出对比结果,应为true
        System.out.println(Arrays.equals(originalByteArray, byteArray));
    }
}

原理说明

默认情况下,Jackson的byte[]反序列化器会尝试将输入解析为Base64编码的JSON字符串(符合JSON规范的二进制数据表示方式),但你的输入是图片原始字节,并非Base64,因此触发UTF-8解析错误。自定义反序列化器通过p.getBinaryValue()直接读取输入流的原始字节,完全跳过JSON解析流程,从而实现字节数组的原样透传。

适配OpenAPI生成的客户端

将上述配置好的ObjectMapper传入OpenAPI客户端的配置中即可(具体方式取决于客户端生成工具,通常可通过客户端的ApiClient类的setObjectMapper方法设置)。

内容的提问来源于stack exchange,提问作者Antônio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:48:13