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

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的封装,可以自己基于这个库写转换逻辑,可控性更高,也支持大文件处理:

  1. 先在pubspec.yaml引入依赖:
dependencies:
  xml: ^6.5.0
  1. 转换示例代码:
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);
}
  1. 调用后即可直接用Key取值:
final jsonData = await xmlToJson();
debugPrint(jsonData['channel']['title']); // 输出 Beloved Skincare
  • 大文件支持:如果你的XML文件体积很大,可以用XmlEventParser做流式解析,无需一次性加载整个文件到内存,性能更优。

方案2:继续使用xml2json库

如果你不需要自定义转换逻辑,直接使用成熟的xml2json封装是最省心的方案,性能和稳定性都经过验证。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:15:00