Dart中如何将字符串转为Map<String, dynamic>并实现文件读写
解决Dart中非标准JSON字符串转Map及文件读写问题
首先,你给出的字符串不是标准JSON格式(标准JSON要求键必须用双引号包裹),直接用Dart内置的jsonDecode会解析失败。下面分模块解决你的所有需求:
一、将非标准JSON字符串转换为Map<String, dynamic>
方法1:正则预处理(适合简单场景)
如果你的字符串结构规整(键都是标识符,值里没有冒号或特殊字符),可以先用正则给所有键加上双引号,再用标准JSON解析:
import 'dart:convert'; void main() { String rawString = "{first_name : fname,last_name : lname,gender : male, location : { state : state, country : country, place : place} }"; // 正则替换:给无引号的键添加双引号 String formattedJson = rawString.replaceAll(RegExp(r'(\w+)\s*:'), r'"$1":'); // 解析为Map Map<String, dynamic> resultMap = jsonDecode(formattedJson); print(resultMap); }
⚠️ 局限性:如果值里包含key: value类的结构(比如字符串值带冒号),正则会误替换,这种场景建议用下面的第三方库方案。
方法2:使用yaml库解析(健壮通用)
YAML语法天然支持无引号键,和你的字符串格式完美兼容,还能处理字符串、整数、布尔值、嵌套对象等所有你提到的数据类型:
- 先在
pubspec.yaml添加依赖:
dependencies: yaml: ^3.1.2
- 代码实现解析:
import 'package:yaml/yaml.dart'; void main() { String rawString = "{first_name : fname,last_name : lname,gender : male, location : { state : state, country : country, place : place} }"; // 解析后转成Dart原生Map Map<String, dynamic> resultMap = Map<String, dynamic>.from(loadYaml(rawString)); print(resultMap); }
这个方案能处理复杂场景,比如带空格的字符串值、整数、布尔值:
// 示例复杂字符串 String complexString = "{name : 'Alice Smith', age : 25, isStudent : true, address : { city : 'New York', zip : 10001} }"; Map<String, dynamic> complexMap = Map<String, dynamic>.from(loadYaml(complexString)); // 输出会保留正确类型:name是字符串,age是整数,isStudent是布尔值
二、Map的文件保存与读取
保存Map到文件
我们将Map转为标准JSON字符串后写入文件,保证读取时的兼容性:
import 'dart:convert'; import 'dart:io'; Future<void> saveMapToFile(Map<String, dynamic> map, String filePath) async { File file = File(filePath); // 转为带缩进的JSON字符串,提升可读性 String jsonString = jsonEncode(map); await file.writeAsString(jsonString); print("Map已保存到文件:$filePath"); }
从文件读取并解析为Map
读取文件内容后,用标准JSON解析回Map:
Future<Map<String, dynamic>> readMapFromFile(String filePath) async { File file = File(filePath); String jsonString = await file.readAsString(); return jsonDecode(jsonString) as Map<String, dynamic>; }
完整整合示例
import 'dart:convert'; import 'dart:io'; import 'package:yaml/yaml.dart'; void main() async { // 1. 解析非标准字符串为Map String rawString = "{first_name : fname,last_name : lname,gender : male, location : { state : state, country : country, place : place} }"; Map<String, dynamic> dataMap = Map<String, dynamic>.from(loadYaml(rawString)); // 2. 保存到本地文件 String filePath = "user_data.json"; await saveMapToFile(dataMap, filePath); // 3. 从文件读取解析 Map<String, dynamic> loadedMap = await readMapFromFile(filePath); print("从文件读取的Map:$loadedMap"); } Future<void> saveMapToFile(Map<String, dynamic> map, String filePath) async { File file = File(filePath); String jsonString = jsonEncode(map); await file.writeAsString(jsonString); } Future<Map<String, dynamic>> readMapFromFile(String filePath) async { File file = File(filePath); String jsonString = await file.readAsString(); return jsonDecode(jsonString) as Map<String, dynamic>; }
内容的提问来源于stack exchange,提问作者Daniel Mana
相关产品推荐
相关产品推荐

