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

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语法天然支持无引号键,和你的字符串格式完美兼容,还能处理字符串、整数、布尔值、嵌套对象等所有你提到的数据类型:

  1. 先在pubspec.yaml添加依赖:
dependencies:
  yaml: ^3.1.2
  1. 代码实现解析:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:45:24