В настоящее время я пытаюсь прочитать json из хранилища BLOB-объектов Azure, что у меня получается.
Теперь я хочу проанализировать данные и отобразить или распечатать их во Flutter (язык дартс). Ниже приведен код.
Future<void> main() async {
String sasUrl = 'blob file url sas token';
try {
// Send HTTP GET request to the SAS URL
final response = await http.get(Uri.parse(sasUrl));
if (response.statusCode == 200) {
// Parse response body as bytes
String responsebody = response.body;
List<String> lines = LineSplitter().convert(responsebody) ;
lines.forEach((line) {
Map<String, dynamic> jsonData = json.decode(line);
print(jsonData);
jsonData.forEach((key, value) {
print('$key: $value');
});
});
// Handle the data as needed
} else {
print('Failed to fetch data: ${response.statusCode}');
}
} catch (e) {
print('Error fetching data: $e');
}
}
Ошибка, которую я получаю, следующая
Ошибка при получении данных: ожидалось значение типа «Map<String, Dynamic>», но получено значение типа «Список».
Есть ли способ решить эту проблему? Я пробовал использовать кастинг, но не помогло.
все еще получаю ту же ошибку
Во-первых, вам не нужно использовать разделитель строк для анализа json. Просто передайте response.body в jsonDecode.
И еще: после анализа json вы получаете список. Поэтому вы должны изменить эту строку
Map<String, dynamic> jsonData = json.decode(line);
к
Map<String, dynamic> jsonData = json.decode(response.body)[0];
тогда я думаю вы получите желаемый результат. Итак, окончательный код будет выглядеть так:
Future<void> main() async {
String sasUrl = 'blob file url sas token;
try {
// Send HTTP GET request to the SAS URL
final response = await http.get(Uri.parse(sasUrl));
if (response.statusCode == 200) {
// Parse response body as bytes
String responsebody = response.body;
Map<String, dynamic> jsonData = json.decode(responsebody)[0];
print(jsonData);
jsonData.forEach((key, value) {
print('$key: $value');
});
// Handle the data as needed
} else {
print('Failed to fetch data: ${response.statusCode}');
}
} catch (e) {
print('Error fetching data: $e');
}
}
Привет. Спасибо за ваш ответ, это работает. но я добавил строку ниже, не могу изменить строку на целое число
int tstls = int.parse(jsonData['TSTLS']); это строка, добавленная после jsonData.forEach((key, value) { print('$key: $value'); });
Пожалуйста, погуглите и прочитайте, как осуществляется доступ к значениям json. Распечатайте то, что вы получаете в jsonData, если это карта и у вас есть этот ключ, вы легко ее получите. Обратите внимание, что клавиши чувствительны к регистру.
конечные строки = LineSplitter().convert(тело ответа) как список; //попробуем этот способ