JSON转Dart生成代码无效,注释state类后无响应数据问题咨询
问题根因
JSON结构中splitAddress下的state字段为二维字符串数组(List<List<String>>),你使用的在线转换工具无法自动识别多层嵌套的同类型数组结构,生成的类型映射逻辑错误,所以提示生成的Dart代码无效。你注释掉state相关代码后解析逻辑会跳过整个结果映射,因此接口能正常请求但没有数据传递到FutureBuilder的UI渲染层。
解决方法
你可以直接使用下方手动修正后的完整Dart实体类,已适配你给出的JSON结构:
class ApiResponse { Result? result; ApiResponse({this.result}); ApiResponse.fromJson(Map<String, dynamic> json) { result = json['result'] != null ? Result.fromJson(json['result']) : null; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; if (result != null) { data['result'] = result!.toJson(); } return data; } } class Result { UserDetails? userDetails; List<Files>? files; EAadhaar? eAadhaar; Result({this.userDetails, this.files, this.eAadhaar}); Result.fromJson(Map<String, dynamic> json) { userDetails = json['userDetails'] != null ? UserDetails.fromJson(json['userDetails']) : null; if (json['files'] != null) { files = <Files>[]; json['files'].forEach((v) { files!.add(Files.fromJson(v)); }); } eAadhaar = json['eAadhaar'] != null ? EAadhaar.fromJson(json['eAadhaar']) : null; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; if (userDetails != null) { data['userDetails'] = userDetails!.toJson(); } if (files != null) { data['files'] = files!.map((v) => v.toJson()).toList(); } if (eAadhaar != null) { data['eAadhaar'] = eAadhaar!.toJson(); } return data; } } class UserDetails { String? digilockerid; String? name; String? dob; String? gender; String? eaadhaar; UserDetails( {this.digilockerid, this.name, this.dob, this.gender, this.eaadhaar}); UserDetails.fromJson(Map<String, dynamic> json) { digilockerid = json['digilockerid']; name = json['name']; dob = json['dob']; gender = json['gender']; eaadhaar = json['eaadhaar']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['digilockerid'] = digilockerid; data['name'] = name; data['dob'] = dob; data['gender'] = gender; data['eaadhaar'] = eaadhaar; return data; } } class Files { String? name; String? type; String? size; String? date; String? parent; List<String>? mime; String? doctype; String? description; String? issuerid; String? issuer; String? id; Files( {this.name, this.type, this.size, this.date, this.parent, this.mime, this.doctype, this.description, this.issuerid, this.issuer, this.id}); Files.fromJson(Map<String, dynamic> json) { name = json['name']; type = json['type']; size = json['size']; date = json['date']; parent = json['parent']; mime = json['mime'].cast<String>(); doctype = json['doctype']; description = json['description']; issuerid = json['issuerid']; issuer = json['issuer']; id = json['id']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['name'] = name; data['type'] = type; data['size'] = size; data['date'] = date; data['parent'] = parent; data['mime'] = mime; data['doctype'] = doctype; data['description'] = description; data['issuerid'] = issuerid; data['issuer'] = issuer; data['id'] = id; return data; } } class EAadhaar { String? name; String? dob; String? uid; String? gender; X509Data? x509Data; String? address; String? photo; SplitAddress? splitAddress; EAadhaar( {this.name, this.dob, this.uid, this.gender, this.x509Data, this.address, this.photo, this.splitAddress}); EAadhaar.fromJson(Map<String, dynamic> json) { name = json['name']; dob = json['dob']; uid = json['uid']; gender = json['gender']; x509Data = json['x509Data'] != null ? X509Data.fromJson(json['x509Data']) : null; address = json['address']; photo = json['photo']; splitAddress = json['splitAddress'] != null ? SplitAddress.fromJson(json['splitAddress']) : null; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['name'] = name; data['dob'] = dob; data['uid'] = uid; data['gender'] = gender; if (x509Data != null) { data['x509Data'] = x509Data!.toJson(); } data['address'] = address; data['photo'] = photo; if (splitAddress != null) { data['splitAddress'] = splitAddress!.toJson(); } return data; } } class X509Data { String? validAadhaarDSC; X509Data({this.validAadhaarDSC}); X509Data.fromJson(Map<String, dynamic> json) { validAadhaarDSC = json['validAadhaarDSC']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['validAadhaarDSC'] = validAadhaarDSC; return data; } } class SplitAddress { List<String>? district; List<List<String>>? state; List<String>? city; String? pincode; List<String>? country; String? addressLine; SplitAddress( {this.district, this.state, this.city, this.pincode, this.country, this.addressLine}); SplitAddress.fromJson(Map<String, dynamic> json) { district = json['district'].cast<String>(); // 手动适配二维数组结构 if (json['state'] != null) { state = <List<String>>[]; json['state'].forEach((v) { state!.add(v.cast<String>()); }); } city = json['city'].cast<String>(); pincode = json['pincode']; country = json['country'].cast<String>(); addressLine = json['addressLine']; } Map<String, dynamic> toJson() { final Map<String, dynamic> data = <String, dynamic>{}; data['district'] = district; data['state'] = state; data['city'] = city; data['pincode'] = pincode; data['country'] = country; data['addressLine'] = addressLine; return data; } }
使用方法
接口请求成功后直接调用ApiResponse.fromJson(response.data)即可完成解析,解析后的实体可直接传递给FutureBuilder进行UI渲染。
内容的提问来源于stack exchange,提问作者Karthik Nousher
相关产品推荐
相关产品推荐

