Dart使用内置convert库转换XML为JSON后取值异常问题排查
问题原因
dart:convert内置库本身不提供XML解析/XML转JSON的能力,你当前使用的jsonDecode(jsonEncode(file))逻辑完全无效:- 读取到的
file本身就是XML格式的字符串,jsonEncode只会把这个字符串转成JSON字符串格式,jsonDecode再把它解析回原XML字符串,整个过程没有做任何XML结构解析,所以jsonData本质还是字符串类型。你用字符串Key索引自然报错,用数字索引就是取对应位置的单个字符,完全符合你遇到的现象。
- 读取到的
- Dart官方没有内置XML转JSON的功能,不存在仅依赖
dart:convert实现该需求的方案,dart:convert也没有所谓支持小文件XML转JSON的相关说明,你对文档的理解存在偏差。
解决方案
方案1:基于官方维护的XML解析库自行实现转换逻辑
Dart官方团队维护了XML解析库,如果你不想用xml2json的封装,可以自己基于这个库写转换逻辑,可控性更高,也支持大文件处理:
- 先在
pubspec.yaml引入依赖:
dependencies: xml: ^6.5.0
- 转换示例代码:
import 'dart:convert'; import 'package:xml/xml.dart'; import 'package:flutter/services.dart'; Future<Map<String, dynamic>> xmlToJson() async { final xmlString = await rootBundle.loadString('assets/xml_file/belovedskincare.xml'); final document = XmlDocument.parse(xmlString); // 通用XML节点转JSON逻辑实现 Map<String, dynamic> _parseXmlNode(XmlNode node) { final Map<String, dynamic> result = {}; // 处理节点属性 for (final attr in node.attributes) { result['@${attr.name.qualified}'] = attr.value; } // 处理子节点 final childNodes = node.children.where((e) => e is XmlElement || e is XmlText).toList(); if (childNodes.length == 1 && childNodes.first is XmlText) { return childNodes.first.text.trim(); } for (final child in childNodes.whereType<XmlElement>()) { final key = child.name.qualified; final value = _parseXmlNode(child); if (result.containsKey(key)) { if (result[key] is! List) { result[key] = [result[key]]; } result[key].add(value); } else { result[key] = value; } } return result; } return _parseXmlNode(document.rootElement); }
- 调用后即可直接用Key取值:
final jsonData = await xmlToJson(); debugPrint(jsonData['channel']['title']); // 输出 Beloved Skincare
- 大文件支持:如果你的XML文件体积很大,可以用
XmlEventParser做流式解析,无需一次性加载整个文件到内存,性能更优。
方案2:继续使用xml2json库
如果你不需要自定义转换逻辑,直接使用成熟的xml2json封装是最省心的方案,性能和稳定性都经过验证。
内容的提问来源于stack exchange,提问作者Senthur Kumaran
相关产品推荐
相关产品推荐

