【问题标题】:Flutter json.decode() sometimes works and sometimes doesnt while parsing the same objectFlutter json.decode() 在解析同一个对象时有时有效,有时无效
【发布时间】:2020-09-16 02:17:17
【问题描述】:

我是 Flutter 的新手,正在使用 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"
            }
        },

【问题讨论】:

标签: json flutter dart


【解决方案1】:

好的,经过一番研究后,我意识到了问题所在。 我使用的 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();

  }

【讨论】:

  • 我正在使用 http 包,但我遇到了这个问题。它有时工作得很好,但有时却不行,而且给我和你一样的错误。
  • 您好 Zabeeh 我意识到当服务器返回大量数据(即数千条记录)时出现问题,因此库以某种方式从服务器获取不完整的数据(缺少几条记录),因此是 JSON 对象坏了。尝试检查您是否获得了所有预期的数据
  • 似乎是这样.. 我会看看这是否也发生在生产中,尽管它看起来只是在开发过程中发生在模拟器上。无论如何,谢谢你的洞察力:)
  • 是的,如果它发生在真实设备/产品上,请告诉我。当这个问题以某种方式出现时,我并没有想到要在真实设备上对其进行测试。祝你好运!
  • 嗨,法尔汉!我刚刚在真实设备上以发布模式对其进行了测试,它工作正常。我不面对这个问题。谢谢。
【解决方案2】:

肯定是模拟器的问题,找了好几天才找到这个帖子,我已经验证它在我的真手机上没有失败。

不同的模拟器失败的次数不同(可能与内存有关??)。

还可以考虑使用compute(jsonDecode, response.body) 来解码Parse JSON in the background 中指示的字符串。

compute 在模拟器上失败的次数更少,但有时仍然失败。在真实手机中不会失败。

【讨论】:

    猜你喜欢
    • 2019-06-06
    • 2015-02-11
    • 2012-08-02
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多