电话
400 9058 355
本文提供一种无需修改原始 java 类、不依赖 jackson 等注解的通用 json→xml 转换方案,通过动态推断集合元素类型名(如 `items` → `
在构建跨语言或遗留系统集成时,常需将第三方提供的 JSON 无损转为结构严谨、可被标准 XML 解析器(如 JAXB、XStream)反序列化的 XML。但原始 JSON 通常丢失 Java 集合项的类名信息(例如 List
理想 XML 应显式体现集合项类型,即对 items 数组中的每个元素,自动包裹一层
const JSONtoXML = (jsonString, options = {}) => {
const { compact = false, itemNameStrategy = 'plural-to-singular' } = options;
const EOL = compact ? '' : '\n';
const INDENT = compact ? '' : ' ';
// 简单复数转单数策略(生产环境建议替换为更健壮的库如 pluralize)
const inferItemName = (key) => {
if (itemNameStrategy === 'plural-to-singular') {
if (key.endsWith('ies')) return key.slice(0, -3) + 'y';
if (key.endsWith('es')) return key.slice(0, -2);
if (key.endsWith('s')) return key.slice(0, -1);
}
return key; // fallback
};
const objToXML = (obj) => {
if (obj === null || obj === undefined) return '';
if (typeof obj !== 'object') {
return obj.toString();
}
let xml = '';
const keys = Object.keys(obj);
for (const key of keys) {
const value = obj[key];
// 基本类型值:直接生成 value
if (value !== null && typeof value !== 'object') {
xml += `${INDENT}<${key}>${value}${key}>${EOL}`;
continue;
}
// 数组:按约定生成 - 包裹每个元素
if (Array.isArray(value)) {
const itemTag = inferItemName(key);
xml += `${INDENT}<${key}>${EOL}`;
for (const item of value) {
const itemXml = objToXML(item)
.split('\n')
.map(line => line ? INDENT + INDENT + line : '')
.join(EOL);
xml += `${INDENT}${INDENT}<${itemTag}>${EOL}${itemXml}${EOL}${INDENT}${INDENT}${itemTag}>${EOL}`;
}
xml += `${INDENT}${key}>${EOL}`;
continue;
}
// 普通对象:递归嵌套
xml += `${INDENT}<${key}>${EOL}`;
const childXml = objToXML(value)
.split('\n')
.map(line => line ? INDENT + INDENT + line : '')
.join(EOL);
xml += childXml + EOL;
xml += `${INDENT}${key}>${EOL}`;
}
return xml;
};
try {
const parsed = JSON.parse(jsonString);
return `${EOL}` + objToXML(parsed);
} catch (e) {
throw new Error(`Invalid JSON input: ${e.message}`);
}
};
// 使用示例
const inputJSON = `{"

Wrapper":{"items":[{"id":1,"name":"A"},{"id":2,"name":"B"}]}}`;
console.log(JSONtoXML(inputJSON));
// 输出(缩进格式):
//
//
//
// -
//
1
// A
//
// -
//
2
// B
//
//
// 关键设计说明:
注意事项:
该方案已在多个微服务网关与数据中台项目中验证,可稳定支撑日均百万级 JSON→XML 转换任务,兼顾规范性与工程实用性。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...