#arrays #json #flutter #dart
#массивы #json #флаттер #dart
Вопрос:
Я должен проанализировать следующий json для модели данных в flutter
[
{
"cmb_marital_status": {
"1": "Unmarried",
"2": " Married",
"3": " Widow",
"4": " Divorced",
"5": " Separated",
"6": " Living together"
},
"cmb_gender": {
"M": "Male",
"F": "Female"
},
"cmb_yes/no": {
"1": "No",
"2": " Yes"
}
}]
И я создал эту модель данных для анализа из запроса API.
class AllData {
CmbMaritalStatus cmbMaritalStatus;
CmbGender cmbGender;
CmbYesNo cmbYesNo;
AllData(
{this.cmbMaritalStatus,
this.cmbGender,
this.cmbYesNo});
AllData.fromJson(Map<String, dynamic> json) {
cmbMaritalStatus = json['cmb_marital_status'] != null
? new CmbMaritalStatus.fromJson(json['cmb_marital_status'])
: null;
cmbGender = json['cmb_gender'] != null
? new CmbGender.fromJson(json['cmb_gender'])
: null;
cmbYesNo = json['cmb_yes/no'] != null
? new CmbYesNo.fromJson(json['cmb_yes/no'])
: null;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
if (this.cmbMaritalStatus != null) {
data['cmb_marital_status'] = this.cmbMaritalStatus.toJson();
}
if (this.cmbGender != null) {
data['cmb_gender'] = this.cmbGender.toJson();
}
if (this.cmbYesNo != null) {
data['cmb_yes/no'] = this.cmbYesNo.toJson();
}
return data;
}
}
class CmbMaritalStatus {
String s1;
String s2;
String s3;
String s4;
String s5;
String s6;
CmbMaritalStatus({this.s1, this.s2, this.s3, this.s4, this.s5, this.s6});
CmbMaritalStatus.fromJson(Map<String, dynamic> json) {
s1 = json['1'];
s2 = json['2'];
s3 = json['3'];
s4 = json['4'];
s5 = json['5'];
s6 = json['6'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['1'] = this.s1;
data['2'] = this.s2;
data['3'] = this.s3;
data['4'] = this.s4;
data['5'] = this.s5;
data['6'] = this.s6;
return data;
}
}
class CmbGender {
String m;
String f;
CmbGender({this.m, this.f});
CmbGender.fromJson(Map<String, dynamic> json) {
m = json['M'];
f = json['F'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['M'] = this.m;
data['F'] = this.f;
return data;
}
}
class CmbYesNo {
String s1;
String s2;
CmbYesNo({this.s1, this.s2});
CmbYesNo.fromJson(Map<String, dynamic> json) {
s1 = json['1'];
s2 = json['2'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['1'] = this.s1;
data['2'] = this.s2;
return data;
}
}
}
И я использую этот код запроса API для анализа данных в модели данных.
Future <List<AllData>> getAllData(context) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
final authToken = prefs.getString('accessToken');
List<AllData> data;
try{
final response = await http.get(GET_ALL_DATA,
headers: {
HttpHeaders.contentTypeHeader:"application/json",
HttpHeaders.authorizationHeader: authToken
},
);
var responseBody = json.decode(response.body);
print("all data response: $responseBody");
if(response.statusCode == 200){
var list = json.decode(responseBody[0]) as List;
data = list.map((i)=> AllData.fromJson(i)).toList();
return data;
}else if(response.statusCode == 400 || response.statusCode == 404 || response.statusCode == 401){
Toast.show("Server error",context,backgroundColor: Colors.red,textColor: Colors.white);
}else if (response.statusCode == 500){
Toast.show("Server error",context,backgroundColor: Colors.red,textColor: Colors.white);
}else{
Toast.show("Server error",context,backgroundColor: Colors.red,textColor: Colors.white);
}
}catch (e){
Toast.show("Server error",context,backgroundColor: Colors.red,textColor: Colors.white);
}
return data;
}
Но он возвращает эту ошибку «тип ‘_InternalLinkedHashMap<String, dynamic>’ не является подтипом типа ‘String'»
Как я могу успешно проанализировать этот json?
Ответ №1:
Попробуйте получить список responseBody
напрямую:
final responseBody = json.decode(response.body);
print("all data response: $responseBody");
if(response.statusCode == 200) {
data = responseBody.map((i)=> AllData.fromJson(i)).toList();
return data;
}
Ответ №2:
Во-первых, вы уже декодировали response.body
один раз, и вам не нужно делать это снова. Во-вторых, responseBody
List
ваш код уже должен выглядеть так
data = responseBody.map((i)=> AllData.fromJson(i)).toList();
return data;