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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:55:21