【问题标题】:How should I decode this json response?我应该如何解码这个 json 响应?
【发布时间】:2019-09-17 12:13:51
【问题描述】:

我想在我的颤振应用中解码服务器响应,所以这是我从服务器得到的 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 响应在我的应用程序中按预期工作。它给你任何线索吗?

那么为什么我不能解码这个响应呢?在此先感谢:)

【问题讨论】:

  • 您的代码运行良好。错误一定是别的东西。我可以看看你的完整代码吗?
  • 我猜是json响应有问题,你不这么认为吗?
  • 我使用jsonformatter.curiousconcept.com 来验证 json 响应,当我在问题中输入 json 响应时,它通过了 RFC 7159 标准测试但 RFC 4627 测试失败。
  • 我再次将jsonformatter.curiousconcept.com 用于jsonplaceholder.typicode.com 中的json 响应示例,并且两个测试都通过了,并且json 响应在我的应用程序中按预期工作。它给你任何线索吗?
  • 您上面发布的 json 不正确。标签名称(例如UserName)必须是双引号("UserName")而不是单引号('UserName')。请使用实际的 JSON 更新问题。

标签: android json api dart flutter


【解决方案1】:

尝试如下:

var user = json.decode(response.body) as Map<String, dynamic>;
print(user['userId']);

更完整的解决方案是使用json serializable

【讨论】:

  • 没什么区别
【解决方案2】:

你尝试过 import dart:convert 并使用 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']);

这些值不需要双引号,因此如果它们不在文字字符串中,您可以不理会它们。

【讨论】:

    【解决方案3】:

    需要指定json映射类型

    Map<String,dynamic> result = Map<String,dynamic>.from(json.decode(body.data));
    
    print(result);
    

    【讨论】:

      【解决方案4】:

      谢谢大家, 我最终告诉后端人员更改响应(删除前导和尾随双引号并为字符串使用双引号)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-09
        • 2012-01-16
        • 1970-01-01
        • 2016-08-20
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多