Springboot中如何移除JSON转XML时生成的多余
字符
解决XmlMapper转XML时出现多余
字符的问题
问题场景
我使用Jackson的XmlMapper.writeValueAsString()方法将JSON对象转换为XML,但转换后的XML里,TxtValue字段出现了多余的
字符(对应JSON里的\r回车符),希望移除这些字符并保留正常换行。
相关代码、输入输出如下:
转换代码:
XmlMapper xmlMapper = new XmlMapper(); String xml = ""; xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); try { xml = xmlMapper.writeValueAsString(inputJsonObject); }catch (Exception e){ e.printStackTrace(); throw new Exception("Error!"); }
输入JSON:
{ "Atribut": [ { "RnatrId": 71945793, "TxtValue": "AssetId: 545654, Aktiviran: DA\r\nCustomerName: John Wick\r\nDSLAM Pozicija: Dawa_daslkads 342", "NumValue": 0, "DateValue": "", "MultiselectId": "", "MultiselectTxt": "" } ] }
转换后XML(含多余
):
<Atribut> <RnatrId>71945793</RnatrId> <TxtValue> AssetId: 545654, Aktiviran: DA
 CustomerName: John Wick
 DSLAM Pozicija: Dawa_daslkads 342
 </TxtValue> <NumValue>0</NumValue> <DateValue></DateValue> <MultiselectId></MultiselectId> <MultiselectTxt></MultiselectTxt> </Atribut>
期望输出XML:
<Atribut> <RnatrId>71945793</RnatrId> <TxtValue> AssetId: 545654, Aktiviran: DA CustomerName: John Wick DSLAM Pozicija: Dawa_daslkads 342 </TxtValue> <NumValue>0</NumValue> <DateValue></DateValue> <MultiselectId></MultiselectId> <MultiselectTxt></MultiselectTxt> </Atribut>
解决方案
方案1:预处理JSON中的回车符
在转换前直接修改JSON里的TxtValue字段,把所有\r字符移除:
如果使用org.json.JSONObject:
// 遍历Atribut数组,处理每个对象的TxtValue JSONArray atributArray = inputJsonObject.getJSONArray("Atribut"); for (int i = 0; i < atributArray.length(); i++) { JSONObject atribut = atributArray.getJSONObject(i); String txtValue = atribut.getString("TxtValue"); // 替换所有\r为空 txtValue = txtValue.replace("\r", ""); atribut.put("TxtValue", txtValue); } // 执行转换 xml = xmlMapper.writeValueAsString(inputJsonObject);
如果使用Jackson的ObjectNode:
ArrayNode atributArray = (ArrayNode) inputJsonObject.get("Atribut"); for (JsonNode node : atributArray) { ObjectNode atribut = (ObjectNode) node; String txtValue = atribut.get("TxtValue").asText(); txtValue = txtValue.replace("\r", ""); atribut.put("TxtValue", txtValue); }
方案2:配置XmlMapper禁用回车符转义
Jackson的XmlMapper默认会把\r转义为
,可以通过关闭ToXmlGenerator.Feature.ESCAPE_CR特性来解决:
XmlMapper xmlMapper = new XmlMapper(); // 禁用回车符的XML实体转义 xmlMapper.configure(ToXmlGenerator.Feature.ESCAPE_CR, false); // 保留原有反序列化配置 xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); try { xml = xmlMapper.writeValueAsString(inputJsonObject); }catch (Exception e){ e.printStackTrace(); throw new Exception("Error!"); }
这个配置会让XmlMapper在序列化时不对\r进行转义,\r\n会直接被处理为正常换行,不会生成
实体。
内容的提问来源于stack exchange,提问作者Simo
相关产品推荐
相关产品推荐

