#android #json #flutter
Вопрос:
Мы сталкиваемся с этим исключением при извлечении данных из JSON, и мы приложили код, а также формат JSON.
Не уверен, по какой причине я получаю исключение » Необработанное исключение: тип «(динамический) =gt; Null » не является подтипом типа «(строка, динамический) =gt;gt; пусто» из «f»». Кажется, все сделано правильно, но все равно получается исключение
Файл Продукта
class Product { int? id; String? title; String? image; int? price; int? discount; String? description; Category? category; int? finalprice; bool? favorites; bool? exclusive; Product( {this.id, this.title, this.image, this.price, this.discount, this.description, this.category, this.finalprice, this.favorites, this.exclusive}); Product.fromJson(Maplt;String, dynamicgt; json) { id = json['id']; title = json['title']; image = json['image']; price = json['price']; discount = json['discount']; description = json['description']; category = json['category'] != null ? new Category.fromJson(json['category']) : null; finalprice = json['finalprice']; favorites = json['favorites']; exclusive = json['exclusive']; } Maplt;String, dynamicgt; toJson() { final Maplt;String, dynamicgt; data = new Maplt;String, dynamicgt;(); data['id'] = this.id; data['title'] = this.title; data['image'] = this.image; data['price'] = this.price; data['discount'] = this.discount; data['description'] = this.description; if (this.category != null) { data['category'] = this.category!.toJson(); } data['finalprice'] = this.finalprice; data['favorites'] = this.favorites; data['exclusive'] = this.exclusive; return data; } } class Category { int? id; String? categoryName; Category({this.id, this.categoryName}); Category.fromJson(Maplt;String, dynamicgt; json) { id = json['id']; categoryName = json['category']; } Maplt;String, dynamicgt; toJson() { final Maplt;String, dynamicgt; data = new Maplt;String, dynamicgt;(); data['id'] = this.id; data['category_name'] = this.categoryName; return data; } }
Структура продукта.файл для дротиков
class ProductDataStacture with ChangeNotifier { Listlt;Productgt; _products = []; Futurelt;boolgt; getProducts() async { String url = 'https://ecom.techoxy.in'; try { http.Response response = await http.get(Uri.parse(url "/home"), headers: { 'Authorization': 'token a867c3c092e8b1195f398ed5ca52dda4e5ff5ed8' }); var data = json.decode(response.body); print(data); Listlt;Productgt; demo = []; data.forEach((element) { Product product = Product.fromJson(element); demo.add(product); print(product); }); _products = demo; return true; } catch (e) { print("e getProducts"); print(e); return true; } } Listlt;Productgt; get productsList { return [..._products]; } }
JSON format
{ "banners": [ { "name": "Test Banner", "image": "/media/banners/Diwali-image-1200x600.jpg", "link": "#", "first": true }, { "name": "Test2", "image": "/media/banners/Flipkart-Big-Diwali-Sale-2020.jpg", "link": "#", "first": true } ], "products": [ { "id": 3, "title": "Plain White Shirt", "image": "https://media.istockphoto.com/photos/mens-shirt-picture-id488160041?k=20amp;m=488160041amp;s=612x612amp;w=0amp;h=OH_-skyES8-aeTvDQHdVDZ6GKLsqp6adFJC8u6O6_UY=", "description": "xcvipoer erefc", "price": 2013.54, "discount": 0.0, "finalprice": 2013.54, "exclusive": true, "favourites": [ { "id": 1, "username": "billa", "photo": null } ], "cart": [], "category": { "name": "Shirts", "category": { "id": 1, "name": "Clothing", "image": null } } } ], "categories": [ { "name": "Clothing", "image": null } ], "primary": [ { "name": "Test Banner", "image": "/media/banners/Diwali-image-1200x600.jpg", "link": "#", "first": true }, { "name": "Test3", "image": "/media/banners/Diwali-image-1200x600_nJrJRij.jpg", "link": "#", "first": false } ], "secondary": [ { "name": "Test Banner", "image": "/media/banners/Diwali-image-1200x600.jpg", "link": "#", "first": true }, { "name": "Test3", "image": "/media/banners/Diwali-image-1200x600_nJrJRij.jpg", "link": "#", "first": false } ], "dailydeal": [ { "id": 3, "title": "Plain White Shirt", "image": "https://media.istockphoto.com/photos/mens-shirt-picture-id488160041?k=20amp;m=488160041amp;s=612x612amp;w=0amp;h=OH_-skyES8-aeTvDQHdVDZ6GKLsqp6adFJC8u6O6_UY=", "description": "xcvipoer erefc", "price": 2013.54, "discount": 0.0, "finalprice": 2013.54, "exclusive": true, "favourites": [ { "id": 1, "username": "billa", "photo": null } ], "cart": [], "category": { "name": "Shirts", "category": { "id": 1, "name": "Clothing", "image": null } } } ], "random": [ { "id": 1, "title": "shirt", "image": "https://minimal-kit-react.vercel.app/static/mock-images/products/product_7.jpg", "description": "dfmkdgfdkmgnfdgn", "price": 521463.02, "discount": 0.0, "finalprice": 521463.02, "exclusive": false, "favourites": [], "cart": [], "category": { "name": "Footwear", "category": { "id": 1, "name": "Clothing", "image": null } } }, { "id": 2, "title": "tshirt", "image": "https://minimal-kit-react.vercel.app/static/mock-images/products/product_2.jpg", "description": "fdg aodkrorf sedfmsdkg", "price": 6589.46, "discount": 0.0, "finalprice": 6589.46, "exclusive": false, "favourites": [ { "id": 1, "username": "billa", "photo": null } ], "cart": [ { "id": 7, "quantity": 2, "total": 13178.92, "active": false, "user": { "id": 1, "password": "pbkdf2_sha256$260000$GUUdFMt9N0G2itKiCNPCu1$05cKKGxS969qAIvxbziYsQl/f9uMk0Vqd9FXeUBRs6A=", "username": "billa", "email": "billa@gmail.com", "name": null, "date_joined": "2021-11-15T14:43:11.457711Z", "last_login": "2021-11-24T16:29:33.919578Z", "is_staff": true, "is_superuser": true, "type": "S", "photo": null, "contact": null, "address": [ 1, 2 ] }, "product": { "id": 2, "title": "tshirt", "poster": null, "image": "https://minimal-kit-react.vercel.app/static/mock-images/products/product_2.jpg", "size": null, "description": "fdg aodkrorf sedfmsdkg", "quantity": null, "quantityunit": null, "stockuntil": null, "price": 6589.46, "discount": 0.0, "gst": 0.0, "taxamount": 0.0, "finalprice": 6589.46, "averagerating": 3.2, "added": "2021-11-15T14:46:26.137948Z", "edited": "2021-11-17T08:04:57.949012Z", "exclusive": false, "dailydeal": false, "category": 1, "favourites": [ 1 ], "cart": [ 7 ] } } ], "category": { "name": "Footwear", "category": { "id": 1, "name": "Clothing", "image": null } } }, { "id": 3, "title": "Plain White Shirt", "image": "https://media.istockphoto.com/photos/mens-shirt-picture-id488160041?k=20amp;m=488160041amp;s=612x612amp;w=0amp;h=OH_-skyES8-aeTvDQHdVDZ6GKLsqp6adFJC8u6O6_UY=", "description": "xcvipoer erefc", "price": 2013.54, "discount": 0.0, "finalprice": 2013.54, "exclusive": true, "favourites": [ { "id": 1, "username": "billa", "photo": null } ], "cart": [], "category": { "name": "Shirts", "category": { "id": 1, "name": "Clothing", "image": null } } } ] }
Обновленный код: Это обновленный код
try { http.Response response = await http.get(Uri.parse(url "/home"), headers: { 'Authorization': 'token a867c3c092e8b1195f398ed5ca52dda4e5ff5ed8' }); var data = json.decode(response.body); print(data); Listlt;Productgt; demo = []; data['products'].forEach((element) { Product product = Product.fromJson(element); demo.add(product); print(product); }); _products = demo; return true; } catch (e) { print("e getProducts"); print(e); return true; }
Вывод на консоль:
The Flutter DevTools debugger and profiler on sdk gphone x86 is available at: http://127.0.0.1:9102?uri=http://127.0.0.1:55482/rQGykIbE6KQ=/ I/flutter ( 8707): e getProducts I/flutter ( 8707): SocketException: Failed host lookup: 'ecom.techoxy.in' (OS Error: No address associated with hostname, errno = 7)
Комментарии:
1. в какой строке вы получаете эту ошибку ??
2. Он генерирует исключение из файла структуры данных продукта в блоке catch. Я новичок в этом, если возможно, любезно помогите мне решить эту проблему.
3. Исключение SocketException, которое вы получаете, связано с сетевыми проблемами. Проверьте, можете ли вы по-прежнему вызывать API вручную (через клиентский инструмент http, такой как curl, postman и т. Д.), И что устройство, на котором вы запускаете это, подключено к Интернету
4. Теперь он дает этот «тип» _InternalLinkedHashMaplt;Строка, динамическаяgt;» не является подтипом типа «Категория»?»
Ответ №1:
Ваш ответ json-это объект, а не массив. Разбор его на объекты продукта с data.forEach((element) ...
помощью не будет работать. Может быть, вы хотите только разобрать data['products']
здесь вместо этого?
Если это так, вы можете использовать data['products'].forEach(...)
, и он больше не будет выдавать эту ошибку, но у вас есть некоторые другие вещи, которые не являются правильными.
- Значения для
price
,discount
иfinalprice
должны бытьdouble
вместоint
. favorites
представляет собой список какого-либо объекта, но определяется какbool
- имя категории имеет 3 разных ключа для
toJson
,fromJson
и в фактическом json
Комментарии:
1. Я добавил обновленный код, но он вызывает исключение, я добавил правку в свой вопрос