Flutter解析Map<String, String>时出现引号丢失异常问题求助
我写了一个将JSON文件转换为Token类的工厂方法,其中tokenProperties是Map<String, dynamic>?类型。传入的map参数里,properties的键和值都是动态变化的,但在赋值tokenProperties: map['properties']时出现了引号丢失的异常。
相关代码片段:
Map<String, dynamic>? tokenProperties; factory Token.fromJson(Map<String, dynamic> map) { return Token( tokenProperties: map['properties'] ); }
完整Token类代码:
// Dart imports: import 'dart:convert'; /// SPDX-License-Identifier: AGPL-3.0-or-later // To parse this JSON data, do // // final token = tokenFromJson(jsonString); Token tokenFromJson(String str) => Token.fromJson(json.decode(str)); String tokenToJson(Token data) => jsonEncode(data.toJson()); String tokenToJsonForTxDataContent(Token data) { return jsonEncode(data.toJsonForTxDataContent()); } class Token { Token( {this.address, this.genesis, this.name, this.id, this.supply, this.type, this.symbol, this.tokenProperties}); String? address; String? genesis; String? name; String? id; int? supply; String? type; String? symbol; Map<String, dynamic>? tokenProperties; factory Token.fromJson(Map<String, dynamic> map) { return Token( address: map['address'], genesis: map['genesis'], name: map['name'], id: map['id'], supply: map['supply'] == null ? null : int.tryParse(map['supply'].toString()), type: map['type'], symbol: map['symbol'], tokenProperties: map['properties']); } Map<String, dynamic> toJson() => <String, dynamic>{ 'address': address, 'genesis': genesis, 'name': name, 'id': id, 'supply': supply, 'type': type, 'symbol': symbol, 'properties': tokenProperties, }; Map<String, dynamic> toJsonForTxDataContent() => <String, dynamic>{ 'name': name, 'supply': supply, 'type': type, 'symbol': symbol, 'properties': tokenProperties, }; }
引号丢失一般不是赋值语句本身的问题,大概率出在JSON解析或序列化阶段,以下是具体排查和修复思路:
检查原始JSON格式
先确认传入的原始JSON字符串中,properties字段的键值是否带有正确引号。如果原始JSON本身格式不规范(比如键未加引号),json.decode解析时会自动修正或丢失内容,导致后续赋值异常。强制标准化
tokenProperties结构
如果properties中的动态值包含特殊字符,或者需要强制保留引号,可以在赋值时对map['properties']做二次序列化再解析,确保结构完全符合JSON规范:tokenProperties: map['properties'] != null ? json.decode(json.encode(map['properties'])) as Map<String, dynamic>? : null调试查看中间值
在工厂方法中添加调试代码,打印map['properties']的实际结构和类型,确认解析后的Map是否和预期一致:factory Token.fromJson(Map<String, dynamic> map) { print('原始properties内容: ${map['properties']}'); print('properties类型: ${map['properties'].runtimeType}'); return Token( // ...其他字段赋值 tokenProperties: map['properties']); }通过打印结果可以快速判断是解析阶段丢失引号,还是后续序列化输出时的问题。
检查序列化输出逻辑
如果是调用tokenToJson或tokenToJsonForTxDataContent时出现引号丢失,可能是jsonEncode对某些特殊类型的处理导致。可以尝试手动遍历tokenProperties,对每个值做字符串转义处理后再序列化。
内容的提问来源于stack exchange,提问作者redDwarf

