使用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里有
<、>、&等特殊字符,必须转义成<、>、&,否则会破坏XML结构。
内容的提问来源于stack exchange,提问作者sid
相关产品推荐
相关产品推荐

