flatter json.decode()在解析同一对象时有时有效,有时无效

flatter json.decode()在解析同一对象时有时有效,有时无效,json,flutter,dart,Json,Flutter,Dart,我是一个新手,在使用json。当我使用json.decode()对从服务器得到的响应进行解码时,有时会出现以下错误 flutter: FormatException: Unexpected character (at character 21) 有时它工作得很好 这是我的代码 try { Map<String, dynamic> map = new Map<String, dynamic>.from( json.decode(contents))

我是一个新手,在使用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);

  }

好的,在做了一点研究之后,我意识到了这个问题。 我使用的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'package:http/http.dart'作为http;
映射请求头={
“内容类型”:“应用程序/json”,
“接受”:“应用程序/json”,
“授权”:“JWT”+DataStream.token
};
最终响应=等待http.get(url.getCompletedJobPackagesURL(),标题:requestHeaders);
如果(response.statusCode==200){
var jsonResponse=convert.jsonDecode(response.body);
打印(jsonResponse);
Map Map=convert.jsonDecode(response.body);
如果(映射[“CompletedJobPackages”]!=null){
DataStream.CompletedJobs包=
parseCompletedJobs(映射[“CompletedJobPackages]”);
completedjobs=DataStream.completedjobs包;
}
设置状态(){
});
}
而不是

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();

  }
导入'dart:io';
最终客户机=HttpClient();
试一试{
final request=wait client.getUrl(Uri.parse(url.getdrivingliceurl());
request.headers.set(HttpHeaders.contentTypeHeader,“application/json;charset=UTF-8”);
添加(“授权”、“JWT”+DataStream.token);
最终响应=等待请求。关闭();
transform(utf8.decoder).listen((内容)异步{
//打印(响应状态码);
Map driverMap=jsonDecode(内容)作为映射;
IsloadLicense=true;
如果(driverMap[“CompletedJobPackages”!=null){
DataStream.CompletedJobs包=
新的驾驶执照.fromJson(driverMap[“CompletedJobPackages]”);
}
设置状态(){
});
});
}捕获(e){
印刷品(e);
ToastUtils.showCustomToast(上下文,“发生错误,请重试!”,false);
//pr.hide();
}

我建议您使用library@dubace嗨,谢谢你的回复。我也试过了,但我仍然面临着同样的问题我在使用http包,但我面临着这个问题。它有时工作得很好,但有时却不行,给我的错误与您的一样。Hello Zabeeh我意识到问题发生在服务器返回大量数据时,即数千条记录,因此库不知何故从服务器获取了不完整的数据(丢失了多条记录)因此JSON对象被破坏了。尝试检查您是否获得了所有预期的数据表,以便。。我将看看这是否也发生在生产中,尽管它看起来只是在开发过程中在模拟器上发生的。无论如何,感谢您的洞察力:)是的,如果它发生在真实的设备/产品上,一定要让我知道。当这个问题以某种方式出现时,我没有想到要在真正的设备上测试它。祝你好运嗨,法汉!我刚刚在一台真正的设备上以发布模式对其进行了测试,效果很好。我不面对这个问题。非常感谢。
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();

  }