Flutter json .decode () иногда работает, а иногда нет при разборе одного и того же объекта - PullRequest
2 голосов
/ 28 мая 2020

Я новичок в флаттере и работал с 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"
            }
        },

1 Ответ

0 голосов
/ 15 июля 2020

Хорошо, после небольшого исследования я понял проблему. библиотека 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();

  }
...