Flutter 使用Dio请求返回数据不是Json字符串,而是Json对象

今天用使用Dio加载数据的时候出现一个异常,就是返回的数据是一个json对象,而不是json字符串,导致无法使用json解析。

错误返回如下:

{title: book, content: think in java}

正常数据应该是这样的:

{"title":"book","content":"think in java"}

经过一番查找后发现官网上有一段备注的:

Flutter 使用Dio请求返回数据不是Json字符串,而是Json对象_第1张图片
说当响应头的content-type为"application/json"时,dio会自动将json转换成json对象,并且responseType默认是json类型接收

于是就在拦截器中打印请求头,如下:
Flutter 使用Dio请求返回数据不是Json字符串,而是Json对象_第2张图片
发现请求头中啥都没有。或者是application/json(content-type是application/json的时候,我又把它设置为空了)

解决办法

没办法只能谷歌搜索dio will parse response string to json,没想到stackoverflow 也有人遇到同样的问题:
https://stackoverflow.com/questions/55666787/how-to-fix-type-errors-when-parsing-json-in-flutter

解决办法是:将responseType 设置为ResponseType.plain,默认使用json接收的。
Flutter 使用Dio请求返回数据不是Json字符串,而是Json对象_第3张图片
这样就可以接收到正常的json字符串了。

总结

其实我这边用了两个接口来测试的,一个是人家的接口,不需要设置content-type和response-type也能获得正常的json字符串。

出现问题的数据则是我们公司的后台接口,所以这个问题具体原因还真不好说。但是使用okhttp确可以获得正常的数据。

所以我估计的是拿到的数据应该就是json数据,所以不需要再使用json类型来接收,使用plain就行了
Flutter 使用Dio请求返回数据不是Json字符串,而是Json对象_第4张图片
可以看到,使用json来接收的话,它会把我们的数据再次装换一次,就成了不能解析的对象了。而使用plain只是重新编码了以下。

所以具体使用json还是其他类型,需要根据实际情况来决定。

你可能感兴趣的:(Flutter开发)