【问题标题】:How to retrieve dynamic values from Api request response如何从 Api 请求响应中检索动态值
【发布时间】:2020-09-02 14:45:45
【问题描述】:

我收到来自我的 API 的动态响应,但我不知道如何像字段正在更改的内部数据一样检索它:

{
    "status": "ERROR",
    "data": {
        "email-common": "This email already exists."
    }
}

另外一次可能是这样的:

{
    "status": "ERROR",
    "data": {
        "password": "passwords do not match"
    }
}

我知道 Java 中的代码,但在颤振中我不知道该怎么做。可以从这个 Java 代码中得到想法

JSONObject data = result.getJSONObject("data");
Iterator<String> keys = data.keys();

while (keys.hasNext()) {
     String key = keys.next();
     Log.d("myTag", data.get(key).toString());
}

如果我这样做是为了密码,那么它会抛出错误,对于另一个我的问题是我可以检索它的任何值(动态检索)

 Future<Map> getJson() async {
     String apiUrl = 'http://3.127.255.230/rest_ci/api/customers';

     Map<String,String> headers = {'Content-Type':'application/json','Authorization':'mykeyyyy'};
     final msg = jsonEncode({
         "username":"tesstestt123",
         "email":"khansdf@gmail.com",
         "password":"testtest",
         "confirm_password":"testtest",
     });

     http.Response response = await http
        .post(apiUrl,
               headers: headers,
               body: msg, );

     return json.decode(response.body); // returns a List type
}

void khan() async {
    getJson();
    String _body = "";

    Map _data = await getJson();

    _body = (_data['status']);
    print(_data);

    if (_body == 'ERROR') {
       setState(() {
      _isLoading = false;
    });
      print("$_data");
      showDialog(
          context: context,
          builder: (c) {
            return AlertDialog(
              title: Text("oops"),
              content: Text(_data['data']['password']),
              actions: <Widget>[
                FlatButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: Text("Close"),
                )
              ],
            );
          });
    }

【问题讨论】:

    标签: api flutter dart


    【解决方案1】:

    Dart 内置了对decode a JSON string 的支持。像这样:

    Map<String, dynamic> jsonMap = json.decode(yourJSONString);
    

    您可以像在 Java 中一样访问此映射中的任何值

    print(jsonMap["status"]);
    print(jsonMap["data"]["password"]);
    

    如果你只是想在不知道它们的键的情况下访问“数据”中的值,你可以迭代它们:

    Map<String, dynamic> dataMap = jsonMap["data"];
    dataMap.keys.forEach((k) {
        print(k);
        print(dataMap[k]);
    });
    

    【讨论】:

    • 我更新了我的问题,我可以检索像“密码”这样的单个值:“密码不匹配”但我的问题是,它正在改变,就像用户输入已经存在的电子邮件一样,响应会有所不同
    • 您可以在 JSON 数据中返回一个标识符,以便能够识别它是什么类型的响应。或者,您可以检查 Map 是否存在您期望在一个响应中出现的某些键,但不是来自另一个响应。
    • 对不起,我是新来的flutter,我无法理解你。我想在“数据”json对象中显示数据,因为我已经告诉过你它的变化。它可以是任何东西,这里有很多可能性,所以无论我想展示什么,提前谢谢
    • 我已经编辑了我的答案。请看看这是否有帮助。您总是可以只迭代嵌套 dataMap 中的键,因此不需要事先知道键。
    【解决方案2】:

    基本上:您可以使用函数来获取数据并在未来的构建器中使用它。

    获取数据:

    Future<dynamic> getData() async{
        http.Response response =  await http.get("url");
        return jsonDecode(response.body);
      }
    

    在 Future Builder 中使用:

    FutureBuilder<dynamic>(
                            future: getData(),
                            builder: (context, snapshot) {
                              if (snapshot.hasError) {
                                return Text(
                                  'There was an error..',
                                );
                              }
                              else if (snapshot.hasData) {
                                return Text(snapshot.data['id'])
    }})
    

    或者你可以把它当作var直接写

    jsonDecode(response.body)['results']
    

    【讨论】:

    • 我更新了我的问题,我可以检索像“密码”这样的单个值:“密码不匹配”但我的问题是,它正在改变,就像用户输入已经存在的电子邮件一样,响应会有所不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多