如何在flatter中将响应JSON转换为对象?
我正在尝试将成功的JSON字符串转换为对象。可能我没有以正确的方式进行操作,但我有几个问题与将JSON转换为Object有关 我也在日志中得到这个例外如何在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 *
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