json - Flutter json.decode() 在解析同一个对象时有时有效,有时无效
问题描述
我是新来的,正在使用 json。当我使用解码从服务器获得的响应时,json.decode()
有时会出现以下错误
flutter: FormatException: Unexpected character (at character 21)
有时它工作得很好。
这是我的代码
try {
Map<String, dynamic> map = new Map<String, dynamic>.from(
json.decode(contents));
if (map["CompletedJobPackages"] != null) {
DataStream.compleatedJobspackage =
DataStream.parseCompletedJobs(map["CompletedJobPackages"]);
print(map["CompletedJobPackages"]);
compleatedJobs = DataStream.compleatedJobspackage;
}
CompletedJobloaded = true;
}
catch(e){
print(e);
ToastUtils.showCustomToast(context, "An Error Occured. Try Again !", false);
}
这是我要解码的对象
{
"CompletedJob": {
"CompletedJobID": 7,
"DriverID": 34,
"JobNumber": "80252C20",
"TraderID": 7,
"TripType": "Two Way",
"CargoType": "wd",
"CargoWeight": 230,
"LoadingPlace": "dc",
"UnloadingPlace": "sd",
"LoadingDate": "2020-05-25",
"LoadingTime": "12:59:00",
"EntryExit": 1,
"AcceptedDelay": 4,
"Price": 34,
"Created": "2020-05-23T04:22:10.000Z"
},
"BillPaid": 0,
"DriverReview": {
"DriverReviewID": 11,
"DriverID": 34,
"TraderID": 7,
"CompletedJobID": 7,
"Rating": 100,
"Review": "dscsdc",
"Created": "2020-05-28"
}
},
解决方案
好的,所以在做了一些研究之后,我意识到了这个问题。我使用的 HTTP 库dart:io
没有在响应中返回完整的 JSON 字符串,因此它们在将其转换为 JSON 对象时存在问题
我刚用
import 'package:http/http.dart' as http;
Map<String, String> requestHeaders = {
'Content-type': 'application/json',
'Accept': 'application/json',
'Authorization':"JWT "+DataStream.token
};
final response = await http.get(URLs.getCompletedJobPackagesURL(), headers:requestHeaders);
if (response.statusCode == 200) {
var jsonResponse = convert.jsonDecode(response.body);
print(jsonResponse);
Map<String, dynamic> map = convert.jsonDecode(response.body);
if(map["CompletedJobPackages"]!= null) {
DataStream.compleatedJobspackage =
DataStream.parseCompletedJobs(map["CompletedJobPackages"]);
compleatedJobs = DataStream.compleatedJobspackage;
}
setState(() {
});
}
代替
import 'dart:io';
final client = HttpClient();
try{
final request = await client.getUrl(Uri.parse(URLs.getDrivingLicenceURL()));
request.headers.set(HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8");
request.headers.add("Authorization", "JWT "+DataStream.token);
final response = await request.close();
response.transform(utf8.decoder).listen((contents) async {
// print(response.statusCode);
Map<String, dynamic> driverMap = jsonDecode(contents) as Map<String, dynamic>;
isloadlicence = true;
if(driverMap["CompletedJobPackages"]!= null) {
DataStream.compleatedJobspackage =
new DrivingLicence.fromJson(driverMap["CompletedJobPackages"]);
}
setState(() {
});
});
}catch(e){
print(e);
ToastUtils.showCustomToast(context, "An Error Occurred. Try Again !", false);
//pr.hide();
}
推荐阅读
- python - Python Pandas groupby 使用另一个数据框中的值而不使用 for 循环
- python - 出现错误:在 Keras 中加载模型时:
- android - Google Play 上不再提供 Android 应用
- delphi - 在运行时填充 ListView
- html - 从另一个组件访问一个组件的方法
- typescript - 一个 Typescript 接口,它允许 2 个可选键之一或没有,但不能同时使用
- m2doc - M2DOC : 变量 self 的初始化
- mocking - Mockito 中的间谍和带代表团的模拟之间的区别
- python - 为什么调试日志没有在控制台和文件中打印
- jquery - 重复无休止的文本选取框