簡體   English   中英

Flutter:如何 JSON 解析列表中 object 中的對象

[英]Flutter: How to JSON parse objects inside an object which is inside a List

我必須將以下 json 解析為 flutter 中的數據 model

[
{
    "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"
    }
}]

我已經創建了這個數據 model 來從 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請求碼將數據解析為數據model。

 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; }

但它返回此錯誤“type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'”

我怎樣才能成功解析這個 json 呢?

嘗試直接從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;
}

首先,您已經response.body進行了一次解碼,無需再次進行。 其次, responseBody已經是List所以你的代碼應該是這樣的

data = responseBody.map((i)=> AllData.fromJson(i)).toList();
return data;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM