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

如何忽略大小写从JSON中解析Dart枚举?

解决枚举解析格式不统一的问题

针对JSON中枚举值格式不固定(全小写、全大写、大驼峰等)的情况,可以通过以下两种方式实现兼容解析:

方案一:统一格式转换后匹配

先将JSON返回的字符串转换为和枚举名称一致的小驼峰格式,再调用values.byName完成匹配:

enum LargeCategoryEnum {
  numberOne, numberTwo;

  factory LargeCategoryEnum.fromJson(String json) {
    final normalized = _toCamelCase(json);
    return values.byName(normalized);
  }

  // 辅助函数:将任意格式字符串转为小驼峰
  static String _toCamelCase(String input) {
    // 先转全小写,按非字母数字字符分割(兼容下划线、空格等分隔符)
    final parts = input.toLowerCase().split(RegExp(r'[^a-zA-Z0-9]'));
    if (parts.isEmpty) return input;
    // 首单词保持小写,后续单词首字母大写
    return parts[0] + parts.sublist(1).map((part) {
      if (part.isEmpty) return '';
      return part[0].toUpperCase() + part.substring(1);
    }).join();
  }
}

这个方法能处理全小写(numberone)、全大写(NUMBERONE)、大驼峰(NumberOne)甚至带分隔符的格式(比如number_one),统一转为枚举需要的小驼峰格式。

方案二:遍历枚举值匹配(忽略格式差异)

遍历所有枚举值,将枚举名称和输入字符串统一转为相同格式(比如全小写)进行匹配:

enum LargeCategoryEnum {
  numberOne, numberTwo;

  factory LargeCategoryEnum.fromJson(String json) {
    final inputLower = json.toLowerCase();
    // 遍历枚举值,匹配转小写后的名称
    for (final enumValue in values) {
      if (enumValue.name.toLowerCase() == inputLower) {
        return enumValue;
      }
    }
    // 无匹配值时抛出异常,也可根据需求返回默认值
    throw ArgumentError('Invalid enum value: $json');
  }
}

这种方式逻辑更直接,无需复杂格式转换,只要输入字符串和枚举名称的字符(忽略大小写)一致就能匹配成功,适合格式差异仅在大小写的场景。

注意事项

  • 如果JSON可能存在无效值,建议在fromJson中添加异常处理,避免程序崩溃。
  • 针对大型枚举类,方案二的遍历性能可以忽略,因为枚举的values是预加载的固定列表,遍历成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:42:38