#json #api #flutter
#json #API #flutter
Вопрос:
Я столкнулся с проблемой при попытке проанализировать json из API, и я обнаружил ошибку ниже.
Response response= await Dio().post(url ,data:{"login_credential":_tmp_email,'password' : _tmp_password});
if ( response.statusCode == 200 ){
var parsedJson = json.decode(response.data);
print(parsedJson["result"]);
print(response.data);
}
} catch (e) {
print(e);
}
Ошибка:
тип ‘_InternalLinkedHashMap’ не является подтипом типа ‘String’
После некоторых поисков в Google и многочисленных попыток отладки. Я пришел к выводу, что структура возвращаемого json довольно сложная, поэтому при ее нормальном анализе будут проблемы.
Структура json выглядит следующим образом.
{
result: 1,
msg: Login Success,
data: {
access_token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvYXNpYS1hbGxuZXQuY29tXC9hcGlcL21vYmlsZS12MVwvYXV0aC5tYW51YWwubG9naW4iLCJpYXQiOjE1NTUxNjQ4OTIsImV4cCI6MTU1NTE2NTAxMiwibmJmIjoxNTU1MTY0ODkyLCJqdGkiOiJjRGtLTVNOMlBmUTdwYjgzIiwic3ViIjo2MTksInBydiI6Ijg2NjVhZTk3NzVjZjI2ZjZiOGU0OTZmODZmYTUzNmQ2OGRkNzE4MTgifQ.YlmzG5bMbXV2_pMa9v5oRItdVBpM878ocfiGD0YS6Zo,
token_type: bearer,
expires_in: 119,
member: {
name: john, email: jogn@gmail.com, id: 619, avatar_url:
https://example.com/images/img_avatar.png
}
}
}
Ответ №1:
Поправьте меня, если я ошибаюсь, я думаю, что я понял, ребята, похоже, что dio как http-клиент уже анализирует ответ json, поэтому нет необходимости в json.decode.
Я могу получать данные, получая к ним доступ с помощью ключей.
print(response.data["result"]);
print(response.data["data"]["member"]["name"]);
Комментарии:
1. когда вы это сделали, var parsedJson = json.decode(response.data); parsedJson стал отображением строки ключа и значения dynamic, так что это больше не json
2. Это здорово!!
Ответ №2:
Как вы уже догадались, Dio анализирует ответ как json, если это указано в Content-Type. Из документации:
/// [responseType] indicates the type of data that the server will respond with
/// options which defined in [ResponseType] are `JSON`, `STREAM`, `PLAIN`.
///
/// The default value is `JSON`, dio will parse response string to json object automatically
/// when the content-type of response is "application/json".
///
/// If you want to receive response data with binary bytes, for example,
/// downloading a image, use `STREAM`.
///
/// If you want to receive the response data with String, use `PLAIN`.
ResponseType responseType;
если вам нужна строка, вы можете использовать _dio.post('...', data: ..., options: Options(responseType: ResponseType.plain))