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
相关产品推荐
相关产品推荐

