今天用使用Dio加载数据的时候出现一个异常,就是返回的数据是一个json对象,而不是json字符串,导致无法使用json解析。
错误返回如下:
{title: book, content: think in java}
正常数据应该是这样的:
{"title":"book","content":"think in java"}
经过一番查找后发现官网上有一段备注的:
说当响应头的content-type为"application/json"时,dio会自动将json转换成json对象,并且responseType默认是json类型接收
于是就在拦截器中打印请求头,如下:
发现请求头中啥都没有。或者是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接收的。
这样就可以接收到正常的json字符串了。
总结
其实我这边用了两个接口来测试的,一个是人家的接口,不需要设置content-type和response-type也能获得正常的json字符串。
出现问题的数据则是我们公司的后台接口,所以这个问题具体原因还真不好说。但是使用okhttp确可以获得正常的数据。
所以我估计的是拿到的数据应该就是json数据,所以不需要再使用json类型来接收,使用plain就行了
可以看到,使用json来接收的话,它会把我们的数据再次装换一次,就成了不能解析的对象了。而使用plain只是重新编码了以下。
所以具体使用json还是其他类型,需要根据实际情况来决定。