Flutter中解析Python转字符串的二维数组及ast.literal_eval替代方案
嘿,我之前也遇到过一模一样的需求!刚好能给你几个实用的解决方案,帮你在Flutter里搞定类似Python ast.literal_eval的数组解析问题~
dart:convert直接解析(最省心,适合基础类型数组) 如果从Python传过来的字符串是类似"[[1,2,3], [4,5,6]]"这种标准的列表格式(元素都是int、double、字符串这类基础类型),那直接用Dart原生的jsonDecode就能搞定——因为Python的列表语法和JSON数组几乎完全兼容:
import 'dart:convert'; void main() { // 假设这是从Python那边拿到的二维数组字符串 String pythonArrayStr = "[[1, 2], [3, 4]]"; // 解析成动态类型的列表 List<dynamic> rawParsed = jsonDecode(pythonArrayStr); // 如果需要强类型的二维数组(比如List<List<int>>),可以手动转一下 List<List<int>> twoDArray = rawParsed.map((innerList) { return (innerList as List<dynamic>).cast<int>(); }).toList(); print(twoDArray); // 输出: [[1, 2], [3, 4]] }
小提醒:如果你的字符串里有Python专属语法(比如用单引号
'包裹字符串、None、True/False),记得先做简单替换:把'换成",None换成null,True/False换成true/false,再用jsonDecode就没问题了。
literal_parser(完美替代ast.literal_eval,支持复杂场景) 如果你的字符串里有更多Python特有的类型(比如元组、集合,或者混合了各种Python语法),那literal_parser这个包绝对是你的救星——它几乎就是Dart版本的ast.literal_eval,能直接解析Python风格的字面量:
- 先在
pubspec.yaml里添加依赖:
dependencies: literal_parser: ^1.0.0
- 然后就能直接用了:
import 'package:literal_parser/literal_parser.dart'; void main() { // 带Python特色的字符串,比如单引号、元组、布尔值 String pythonStyleStr = "[[1, 'hello world'], (3, 4), {'status': True}]"; var parsedResult = literalParser.parse(pythonStyleStr); print(parsedResult); // 输出: [[1, hello world], (3, 4), {status: true}] // 要是只想取二维数组部分,直接转类型就行 List<List<dynamic>> targetArray = parsedResult[0] as List<List<dynamic>>; }
这个包不需要你手动做任何语法替换,直接就能解析各种Python风格的字面量,非常灵活。
如果不想依赖任何第三方包,也可以自己写个简单的解析逻辑——比如用正则分割字符串或者逐个字符处理,但这种方法只适合超级简单的二维数组场景,一旦遇到包含特殊字符(比如逗号、括号)的元素,很容易出bug,所以优先推荐前两种方案。
总结一下:要是只是普通的基础类型二维数组,原生jsonDecode足够用;要是有复杂的Python语法,直接上literal_parser包就行,完全能替代Python的ast.literal_eval。
内容的提问来源于stack exchange,提问作者Filip Jurković

