首页 > 解决方案 > 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"
            }
        },

标签: jsonflutterdart

解决方案


好的,所以在做了一些研究之后,我意识到了这个问题。我使用的 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();

  }

推荐阅读