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

JSON解析时如何在对象中传入动态变量实现动态属性读取

问题原因

你当前代码里拼接的'this.parsedUserInfo.info.' + social只是普通字符串,并没有真的访问parsedUserInfo.info对象下的对应动态属性,所以判断逻辑完全不生效。Dart作为强类型语言,不支持直接通过拼接属性名字符串的方式访问对象属性,需要通过重载运算符或者保留原始JsonMap的方式实现动态读取。

解决方法

方式1:给Info类重载[]运算符(推荐)

在你的Info实体类中新增[]运算符重载,支持通过字符串键名读取对应属性:

class Info {
  // 原有属性定义:tw、discord、telegram、fb、tumblr、其他属性
  // 原有fromJson、toJson等逻辑

  // 新增运算符重载
  dynamic operator [](String key) {
    switch (key) {
      case 'tw': return tw;
      case 'discord': return discord;
      case 'telegram': return telegram;
      case 'fb': return fb;
      case 'tumblr': return tumblr;
      default: return null;
    }
  }
}

方式2:保留原始JsonMap

如果不想修改实体类结构,可以在Info类中新增rawJson字段,解析时把对应的JsonMap存下来,后续直接从Map中读取动态键:

class Info {
  late Map<String, dynamic> rawJson;
  // 其他原有属性

  Info.fromJson(Map<String, dynamic> json) : 
    rawJson = json,
    // 原有其他属性赋值逻辑
    tw = json['tw'],
    discord = json['discord'],
    // 其他属性解析
    super();
}

修改后的循环代码

不管用上面哪种方式,修改你的循环逻辑如下即可:

this.parsedUserInfo = UserInfo.fromJson(jsonDecode(value.data));
['tw', 'discord', 'telegram', 'fb', 'tumblr'].forEach((social) {
  // 方式1用这个判断
  final socialValue = this.parsedUserInfo.info[social];
  // 方式2用这个判断
  // final socialValue = this.parsedUserInfo.info.rawJson[social];

  if (socialValue != null && socialValue.toString().isNotEmpty) {
    // 先判断索引是否存在,避免数组越界报错
    final targetIdx = this.parsedPlatforms.data.indexWhere((row) => row.socid == social);
    if (targetIdx != -1) {
      this.parsedPlatforms.data[targetIdx].connected = true;
    }
  }
});

注意事项

  • 原代码尾部缺少})两个闭合符号,修改时记得补全避免语法报错。

内容的提问来源于stack exchange,提问作者mrniamster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:24:03