Flutter中如何解析字符串化JSON 将String类型field字段转为列表
你遇到的问题本质是后端返回的field字段是嵌套序列化的JSON字符串,不是标准JSON数组,所以第一次解析整段响应时只会被识别为String类型,需要做二次反序列化即可转为可用列表。
解决步骤
1. 导入系统转换依赖
在对应Dart文件头部引入内置转换库:
import 'dart:convert';
2. 首次解析根响应数据
先把整段响应字符串转为Map结构:
// 解析根级响应 Map<String, dynamic> rootData = jsonDecode(response); // 取出value节点 Map<String, dynamic> valueData = rootData['value']; // 此时拿到的field为字符串类型 String fieldStr = valueData['field'];
3. 二次解析field得到目标列表
对拿到的fieldStr再次调用反序列化方法,即可得到列表结构:
// 二次反序列化field字符串为List List<dynamic> fieldList = jsonDecode(fieldStr); // 可直接遍历使用,也可进一步转为实体类列表提升类型安全性
可选:定义对应实体类(推荐)
如果需要类型安全的字段访问,可定义对应Field实体类:
class Field { final int fieldId; final String fieldName; final String fieldElementType; final String fieldLabel; final String discription; final bool isDeleted; final String createdDateUTC; Field({ required this.fieldId, required this.fieldName, required this.fieldElementType, required this.fieldLabel, required this.discription, required this.isDeleted, required this.createdDateUTC, }); factory Field.fromJson(Map<String, dynamic> json) { return Field( fieldId: json['FieldId'], fieldName: json['FieldName'], fieldElementType: json['FieldElementType'], fieldLabel: json['FieldLabel'], discription: json['Discription'], isDeleted: json['IsDeleted'], createdDateUTC: json['CreatedDateUTC'], ); } }
定义完成后可直接把动态列表转为实体列表:
List<Field> fieldEntityList = fieldList.map((item) => Field.fromJson(item)).toList();
注意事项
- 反序列化时字段名大小写要和返回JSON完全匹配,否则会出现解析错误
- 条件允许的话可以建议后端直接把
field返回为JSON数组,减少客户端二次解析的冗余操作
内容的提问来源于stack exchange,提问作者muhammed jasir
相关产品推荐
相关产品推荐

