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

Java Jackson XML Base64编码标签反序列化问题求助

问题:XML反序列化时处理Base64编码的Customer节点

API响应示例

<WebResponse>
    <RequestId>6541635537</RequestId>
    <Items>
        <Item>
            <Id>1aSd</Id>
            <Name>spider</Name>
        </Item>
        <Item>
            <Id>2sze</Id>
            <Name>catman</Name>
        </Item>
    </Items> <Customer>PEN1c3RvbWVyPg0KIDxOYW1lPk5pY288L05hbWU+DQogPEFjY291bnRzPg0KICA8QWNjb3VudD4NCiAgIDxUeXBlPlBSTzwvVHlwZT4NCiAgPC9BY2NvdW50Pg0KICA8QWNjb3VudD4NCiAgIDxUeXBlPlBST01BWDwvVHlwZT4NCiAgPC9BY2NvdW50Pg0KIDwvQWNjb3VudHM+DQo8L0N1c3RvbWVyPg==</Customer>
</WebResponse>

解码后的Customer节点内容

<Customer>
 <Name>Nico</Name>
 <Accounts>
  <Account>
   <Type>PRO</Type>
  </Account>
  <Account>
   <Type>PROMAX</Type>
  </Account>
 </Accounts>
</Customer>

当前尝试的代码

ObjectMapper MAPPER = new XmlMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
WebResponse result = MAPPER.readerFor(WebResponse.class).readValue(webResponse);

抛出的异常

Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of org.Customer (although at least one Creator exists): no String-argument

解决思路

  • 核心问题:Jackson默认会把Customer节点的Base64字符串直接尝试反序列化为Customer对象,类型不匹配导致异常,必须先解码再反序列化。
  • 实现步骤:
    1. 临时DTO中转:创建一个临时的WebResponseTemp类,其中Customer字段定义为String类型,先用XmlMapper解析原始XML得到这个临时对象,提取出Base64编码的字符串。
    2. Base64解码:将提取到的字符串解码为XML格式的字符串(注意处理字符编码,确保解码后是正确的XML内容)。
    3. 解析Customer对象:用XmlMapper将解码后的XML字符串解析为Customer对象。
    4. 组装最终对象:创建正式的WebResponse对象,将临时对象中的RequestId、Items等字段赋值,再把解析好的Customer对象注入进去。
  • 进阶方案:自定义Customer字段的反序列化器,通过@JsonDeserialize(using = CustomCustomerDeserializer.class)注解添加到WebResponse的Customer字段上,在反序列化器内部完成Base64解码和XML解析的逻辑,实现自动处理。

内容的提问来源于stack exchange,提问作者user22210101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:10:23