我想在我的flutter应用程序中解码服务器响应,所以这是我从服务器获得的json响应:
"{'UserId':'1','UserName':'sorena','Name':'behzad'}"
这是一个颤动的代码:
class HomeState extends State<Home>{
Map user;
@override
void initState() {
super.initState();
getUser();
}
getUser() async {
var response = await http.get('http://samplename.com/user/1');
user = json.decode(response.body);
print(user['UserId']);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child : Text('hi')
)
);
}
}
当我想在getUser()中打印UserId时,我得到这个错误:(基本上我应该能够做到这一点,对吧?因为我用另一个json响应使用它并且没有问题)
E/flutter (28417): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: type 'String' is not a subtype of type 'Map<dynamic, dynamic>
我使用https://jsonformatter.curiousconcept.com来验证json响应,当我在问题中输入json响应时,它通过RFC 7159标准测试,但RFC 4627测试失败。
我再次使用https://jsonformatter.curiousconcept.com作为https://jsonplaceholder.typicode.com中的json响应示例,并且两个测试都通过了,并且json响应在我的应用程序中按预期工作。它能给你任何线索吗?
那为什么我不能解码这个回复呢?提前致谢 :)
尝试如下:
var user = json.decode(response.body) as Map<String, dynamic>;
print(user['userId']);
更完整的解决方案是使用json serializable
你尝试导入dart:转换并使用jsonDecode()
https://flutter.dev/docs/development/data-and-backend/json
此外,json密钥格式规范需要双引号。
String body='{"UserId":"1","UserName":"sorena","Name":"behzad"}';
var user=(json.decode(body));
print(user['UserId']);
这些值不需要双引号,因此如果它们不在文字字符串中,您可以将它们单独保留。
您需要指定json映射类型
Map<String,dynamic> result = Map<String,dynamic>.from(json.decode(body.data));
print(result);
谢谢所有人,我最后告诉后端人员更改响应(删除前导和尾随双引号并使用字符串双引号)。