Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在flatter中将响应JSON转换为对象?_Json_Http_Dart_Flutter - Fatal编程技术网

如何在flatter中将响应JSON转换为对象?

如何在flatter中将响应JSON转换为对象?,json,http,dart,flutter,Json,Http,Dart,Flutter,我正在尝试将成功的JSON字符串转换为对象。可能我没有以正确的方式进行操作,但我有几个问题与将JSON转换为Object有关 我也在日志中得到这个例外 NoSuchMethodError: Class '**_InternalLinkedHashMap<String, dynamic>' has no instance method 'cast' with matching arguments**.<br> Receiver: _LinkedHashMap len:3 *

我正在尝试将成功的JSON字符串转换为对象。可能我没有以正确的方式进行操作,但我有几个问题与将JSON转换为Object有关

我也在日志中得到这个例外

NoSuchMethodError: Class '**_InternalLinkedHashMap<String, dynamic>' has no instance method 'cast' with matching arguments**.<br>
Receiver: _LinkedHashMap len:3
**Tried calling: cast<Map<String, dynamic>>()**
通过在线工具创建的SignUpResponse。

class SignUpResponse {
    Data data;
    String message;
    bool error;

    SignUpResponse({this.data, this.message, this.error});

    SignUpResponse.fromJson(Map<String, dynamic> json) {
    data = json['data'] != null ? new Data.fromJson(json['data']) : null;
    message = json['message'];
    error = json['error'];
    }

    Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.data != null) {
        data['data'] = this.data.toJson();
    }
    data['message'] = this.message;
    data['error'] = this.error;
    return data;
    }
}

class Data {
    String sId;
    String email;
    String phoneNumber;
    int isAddressApproved;
    String unitNumber;
    String streetAddress;
    String area;
    String zipCode;
    int totalOrder;
    int todayOrder;
    bool isPauseDelivery;
    Null vacationStartDt;
    Null vacationEndDt;
    int defaultLiter;

    Data(
        {this.sId,
        this.email,
        this.phoneNumber,
        this.isAddressApproved,
        this.unitNumber,
        this.streetAddress,
        this.area,
        this.zipCode,
        this.totalOrder,
        this.todayOrder,
        this.isPauseDelivery,
        this.vacationStartDt,
        this.vacationEndDt,
        this.defaultLiter});

    Data.fromJson(Map<String, dynamic> json) {
    sId = json['_id'];
    email = json['email'];
    phoneNumber = json['phoneNumber'];
    isAddressApproved = json['isAddressApproved'];
    unitNumber = json['unitNumber'];
    streetAddress = json['streetAddress'];
    area = json['area'];
    zipCode = json['zipCode'];
    totalOrder = json['totalOrder'];
    todayOrder = json['todayOrder'];
    isPauseDelivery = json['isPauseDelivery'];
    vacationStartDt = json['vacationStartDt'];
    vacationEndDt = json['vacationEndDt'];
    defaultLiter = json['defaultLiter'];
    }

    Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['_id'] = this.sId;
    data['email'] = this.email;
    data['phoneNumber'] = this.phoneNumber;
    data['isAddressApproved'] = this.isAddressApproved;
    data['unitNumber'] = this.unitNumber;
    data['streetAddress'] = this.streetAddress;
    data['area'] = this.area;
    data['zipCode'] = this.zipCode;
    data['totalOrder'] = this.totalOrder;
    data['todayOrder'] = this.todayOrder;
    data['isPauseDelivery'] = this.isPauseDelivery;
    data['vacationStartDt'] = this.vacationStartDt;
    data['vacationEndDt'] = this.vacationEndDt;
    data['defaultLiter'] = this.defaultLiter;
    return data;
    }
}
类签名响应{
数据;
字符串消息;
布尔误差;
SignUpResponse({this.data,this.message,this.error});
SignUpResponse.fromJson(映射json){
data=json['data']!=null?新数据。fromJson(json['data']):null;
message=json['message'];
error=json['error'];
}
映射到JSON(){
最终地图数据=新地图();
如果(this.data!=null){
data['data']=this.data.toJson();
}
数据['message']=此.message;
数据['error']=this.error;
返回数据;
}
}
类数据{
字符串sId;
字符串电子邮件;
字符串电话号码;
int已获得地址批准;
字符串单位数;
字符串地址;
串区;
字符串zipCode;
国际总秩序;
int今日订单;
bool-isPauseDelivery;
空假期开始日期;
空假期NDDT;
整数公升;
资料(
{this.sId,
这是一封电子邮件,
这个电话号码,
此。我的地址已被批准,
这是我的电话号码,
这是我的地址,
这个地区,,
这个.zipCode,
这是我的订单,
这是今天的订单,
这是免费送货,
这个假期开始了,
这是我的假期,
这是});
Data.fromJson(映射json){
sId=json[''u id'];
email=json['email'];
phoneNumber=json['phoneNumber'];
isAddressApproved=json['isAddressApproved'];
unitNumber=json['unitNumber'];
streetAddress=json['streetAddress'];
area=json['area'];
zipCode=json['zipCode'];
totalOrder=json['totalOrder'];
todayOrder=json['todayOrder'];
isPauseDelivery=json['isPauseDelivery'];
vacationStartDt=json['vacationStartDt'];
vacationEndDt=json['vacationEndDt'];
DefaultL=json['DefaultL'];
}
映射到JSON(){
最终地图数据=新地图();
数据[''u id']=this.sId;
数据['email']=this.email;
数据['phoneNumber']=此.phoneNumber;
数据['isAddressApproved']=此。isAddressApproved;
数据['unitNumber']=此.unitNumber;
数据['streetAddress']=this.streetAddress;
数据['area']=此区域;
数据['zipCode']=this.zipCode;
数据['totalOrder']=this.totalOrder;
数据['todayOrder']=this.todayOrder;
数据['isPauseDelivery']=this.isPauseDelivery;
数据['vacationStartDt']=此.vacationStartDt;
数据['vacationEndDt']=this.vacationEndDt;
数据['DefaultL']=此.DefaultL;
返回数据;
}
}
调用REST POST API

void postCallSignUp(BuildContext context, var body) {
// This Function will check Internet is available or not.
Utils.checkConnection().then((connectionResult) {
    if (connectionResult) {
    http.post(Constants.BASE_URL + Constants.CREATE_USER,
        body: body,
        headers: {
            "Accept": "application/json",
            "content-type": "application/json"
        }).then((http.Response response) {
        final String res = response.body;
        final int statusCode = response.statusCode;

        if (statusCode < 200 || statusCode > 400 || json == null) {
        _onFailureResponse(new Exception("Error while fetching data"));
        } else {
        //Parsing json response to particular Object.
        print(json.decode(res));

        // Unable to cast json here...
        final parsed = json.decode(res).cast<Map<String, dynamic>>();
        parsed.map<SignUpResponse>((json) => SignUpResponse.fromJson(json));
        SignUpResponse signUpResponse = parsed.map<SignUpResponse>((json) => SignUpResponse.fromJson(json));
        _onSuccessResponse(signUpResponse);
        }
    });
    } else {
    _onNoInternetConnection();
    Utils.showAlert(context, "Alert", "Internet is not connected.", () {
        Navigator.pop(context);
    });
    }
});
}
void postCallSignUp(BuildContext,var body){
//此功能将检查Internet是否可用。
Utils.checkConnection().then((connectionResult){
if(连接结果){
http.post(Constants.BASE\u URL+Constants.CREATE\u USER,
身体:身体,,
标题:{
“接受”:“应用程序/json”,
“内容类型”:“应用程序/json”
}).然后((http.Response){
最终字符串res=response.body;
最终int statusCode=response.statusCode;
if(statusCode<200 | | statusCode>400 | | json==null){
_onFailureResponse(新异常(“获取数据时出错”);
}否则{
//解析特定对象的json响应。
打印(json.decode(res));
//无法在此处强制转换json。。。
final parsed=json.decode(res.cast();
parsed.map((json)=>SignUpResponse.fromJson(json));
SignUpResponse SignUpResponse=parsed.map((json)=>SignUpResponse.fromJson(json));
_onSuccessResponse(signUpResponse);
}
});
}否则{
_onNoInternetConnection();
Utils.showAlert(上下文,“警报”,“互联网未连接”。,(){
Navigator.pop(上下文);
});
}
});
}

无法理解这里发生了什么?为什么我们要把json转换成特定的对象呢?

不需要使用cast,您可以直接解析到映射

final Map parsed = json.decode(res); 
拥有地图后,可以使用该数据转换为对象

final signUp = SignUpResponse.fromJson(parsed);
如果您想解析一组对象,可以执行以下操作:

//assuming this json returns an array of signupresponse objects
final List parsedList = json.decode(res); 

List<SignUpResponse> list = parsedList.map((val) =>  SignUpResponse.fromJson(val)).toList();
{
  "id": 1,
  "type": 15,
  "innerClass": {
    "id": 1,
    "type": "testing"
  }
}
try {
          mainClassDartObject = MainClass.fromJson(response.body);
     } catch (e) {
          print(e);
     }
//假设此json返回signupresponse对象数组
最终列表parsedList=json.decode(res);
List List=parsedList.map((val)=>SignUpResponse.fromJson(val)).toList();

JSON:

    [
     {
       "id":1,
       "name":"Afghanistan",
       "iso3":"AFG",
       "iso2":"AF",
       "phone_code":"93",
       "capital":"Kabul",
       "currency":"AFN"
     },
     {
       "id":2,
       "name":"Aland Islands",
       "iso3":"ALA",
       "iso2":"AX",
       "phone_code":"+358-18",
       "capital":"Mariehamn",
       "currency":"EUR"
       },
    ]
    class country{
       String id;
       String name;
       String currency;

       country({this.id,this.name,this.currency});

       factory country.fromJson(Map<String, dynamic> parsedJson){
         return country(
         id: parsedJson['id'].toString(),
         name : parsedJson['name'].toString(),
         currency: parsedJson['currency'].toString() 
         );
       }
    }
    await http.post("http://calikidsmap.com/test.php").then((response){

    var ddd=jsonDecode(response.body);

    Country_object_list = (ddd as List)
      .map((data) => new country.fromJson(data))
      .toList();
POJO类:

    [
     {
       "id":1,
       "name":"Afghanistan",
       "iso3":"AFG",
       "iso2":"AF",
       "phone_code":"93",
       "capital":"Kabul",
       "currency":"AFN"
     },
     {
       "id":2,
       "name":"Aland Islands",
       "iso3":"ALA",
       "iso2":"AX",
       "phone_code":"+358-18",
       "capital":"Mariehamn",
       "currency":"EUR"
       },
    ]
    class country{
       String id;
       String name;
       String currency;

       country({this.id,this.name,this.currency});

       factory country.fromJson(Map<String, dynamic> parsedJson){
         return country(
         id: parsedJson['id'].toString(),
         name : parsedJson['name'].toString(),
         currency: parsedJson['currency'].toString() 
         );
       }
    }
    await http.post("http://calikidsmap.com/test.php").then((response){

    var ddd=jsonDecode(response.body);

    Country_object_list = (ddd as List)
      .map((data) => new country.fromJson(data))
      .toList();

相同的答案,但是,当您有嵌套的JSONObject时会发生什么? 简单:

给出如下的jsonResponse:

//assuming this json returns an array of signupresponse objects
final List parsedList = json.decode(res); 

List<SignUpResponse> list = parsedList.map((val) =>  SignUpResponse.fromJson(val)).toList();
{
  "id": 1,
  "type": 15,
  "innerClass": {
    "id": 1,
    "type": "testing"
  }
}
try {
          mainClassDartObject = MainClass.fromJson(response.body);
     } catch (e) {
          print(e);
     }
下面是代码的示例:

class MainClass {
  int id = 0;
  int version = 0;
  InnerClass innerClass;

  MainClass (
      this.id,
      this.version,
      this.innerClass
      );
  
//Create the same factory converter, but using another inner factory 'fromJson' converter
//for the inner class object (InnerClass.fromJson(json['inner_class']))

  factory MainClass.fromJson(dynamic json) {
    return MainClass(
        json['id'] as int, // << put your json response keys instead.
        json['version'] as int,
        InnerClass.fromJson(json['innerClass']) // << this one
    );
  }
最后,您可以在项目的另一部分中使用以下内容:

//assuming this json returns an array of signupresponse objects
final List parsedList = json.decode(res); 

List<SignUpResponse> list = parsedList.map((val) =>  SignUpResponse.fromJson(val)).toList();
{
  "id": 1,
  "type": 15,
  "innerClass": {
    "id": 1,
    "type": "testing"
  }
}
try {
          mainClassDartObject = MainClass.fromJson(response.body);
     } catch (e) {
          print(e);
     }

将此添加到
pubspec.yaml

依赖项:
#这里是您的其他常规依赖项
json_注释:
开发依赖项:
#这里是您的其他dev_依赖项
构建跑步者:
json_可序列化:
对象类

import'package:json_annotation/json_annotation.dart';
“用户g.dart”部分//“用户”是您的dart文件名
///要生成的JSON序列化逻辑。
@JsonSerializable()
类用户{
用户(this.name,this.email);
字符串名;
字符串电子邮件;
factory User.fromJson(Map json)=>$UserFromJson(json);
映射到JSON()=>$UserToJson(此);
}
并在Android Studio的终端上运行

flutter pub run build_runner build
现在像这样转换:

//assuming this json returns an array of signupresponse objects
final List parsedList = json.decode(res); 

List<SignUpResponse> list = parsedList.map((val) =>  SignUpResponse.fromJson(val)).toList();
{
  "id": 1,
  "type": 15,
  "innerClass": {
    "id": 1,
    "type": "testing"
  }
}
try {
          mainClassDartObject = MainClass.fromJson(response.body);
     } catch (e) {
          print(e);
     }
Map results=json.decode(response.body);
User=User.fromJson(结果);

来源

使用这个;最终解析的Map=json.decode(res);所以我们不需要,实际上您只需要:final Map parsed=json.decode(res);如何将解析后的json转换为SignUpResponse?我添加了答案b