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

使用Jackson XmlMapper解析XML转JSON报错,需处理额外字符吗?

解决Jackson XmlMapper解析XML转JSON报错问题

嘿,我来帮你搞定这个XmlMapper解析报错的问题!首先咱们先排查最常见的几个坑:

一、先检查XML的完整性

你提供的XML片段明显是不完整的——<CouponNumber>标签没有闭合,后续的</Coupon>、</Coupons>等闭合标签也缺失了。XML是强格式要求的语言,标签必须成对出现、结构完整,否则任何解析库都会报错。先把XML补全成格式正确的样子,比如:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns2:GetLineItemDetailResponse xmlns:ns2="http://schema.tmt.com/transactionlineitemdetail/loyalty/v1">
  <GetLineItemDetailResult>
    <Coupons>
      <Coupon>
        <CouponType>sim_default_CouponType</CouponType>
        <CouponNumber>123456</CouponNumber>
      </Coupon>
    </Coupons>
  </GetLineItemDetailResult>
</ns2:GetLineItemDetailResponse>

二、处理XML的命名空间问题

你的XML里带有ns2命名空间,Jackson的XmlMapper默认不会自动处理命名空间,这也是常见的报错原因之一。这里给你两种解决方案:

方案1:配置XmlMapper忽略命名空间

如果不需要保留命名空间信息,可以直接配置XmlMapper忽略它,同时关闭未知属性报错(避免因为XML里有未映射的元素导致失败):

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class XmlToJsonExample {
    public static void main(String[] args) throws Exception {
        String xmlContent = "你的完整XML内容";
        
        XmlMapper xmlMapper = XmlMapper.builder()
                // 忽略大小写匹配属性
                .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
                // 忽略未知属性,避免报错
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
                // 关闭默认的包装器,适配XML结构
                .defaultUseWrapper(false)
                .build();
        
        // 解析XML为JsonNode,再转成JSON字符串
        JsonNode jsonNode = xmlMapper.readTree(xmlContent);
        String jsonString = xmlMapper.writeValueAsString(jsonNode);
        System.out.println(jsonString);
    }
}

方案2:用Java实体类映射XML(保留结构)

如果需要精准映射XML结构,可以创建对应的Java实体类,通过Jackson的XML注解处理命名空间:

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.util.List;

@JacksonXmlRootElement(localName = "GetLineItemDetailResponse", namespace = "http://schema.tmt.com/transactionlineitemdetail/loyalty/v1")
public class GetLineItemDetailResponse {
    @JacksonXmlProperty(localName = "GetLineItemDetailResult")
    private GetLineItemDetailResult result;

    // getter和setter
    public GetLineItemDetailResult getResult() { return result; }
    public void setResult(GetLineItemDetailResult result) { this.result = result; }
}

class GetLineItemDetailResult {
    @JacksonXmlElementWrapper(localName = "Coupons")
    @JacksonXmlProperty(localName = "Coupon")
    private List<Coupon> coupons;

    // getter和setter
    public List<Coupon> getCoupons() { return coupons; }
    public void setCoupons(List<Coupon> coupons) { this.coupons = coupons; }
}

class Coupon {
    @JacksonXmlProperty(localName = "CouponType")
    private String couponType;
    @JacksonXmlProperty(localName = "CouponNumber")
    private String couponNumber;

    // getter和setter
    public String getCouponType() { return couponType; }
    public void setCouponType(String couponType) { this.couponType = couponType; }
    public String getCouponNumber() { return couponNumber; }
    public void setCouponNumber(String couponNumber) { this.couponNumber = couponNumber; }
}

然后用XmlMapper解析并转JSON:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class XmlToJsonWithEntity {
    public static void main(String[] args) throws Exception {
        String xmlContent = "你的完整XML内容";
        
        XmlMapper xmlMapper = new XmlMapper();
        GetLineItemDetailResponse response = xmlMapper.readValue(xmlContent, GetLineItemDetailResponse.class);
        
        // 转成JSON字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonString = objectMapper.writeValueAsString(response);
        System.out.println(jsonString);
    }
}

三、其他可能的报错原因

  • 编码问题:确保XML的编码(utf-8)和你读取文件/字符串时的编码一致,避免乱码导致解析失败。
  • 特殊字符未转义:如果XML里有<、>、&等特殊字符,必须转义成&lt;、&gt;、&amp;,否则会破坏XML结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:30:28