Flutter中如何从给定JSON文件获取original_url?
Flutter 获取 JSON 中 original_url 字段的方法
首先你提供的 JSON 存在语法错误,"original_url": b 这部分是无效的,修正后的正确 JSON 如下:
{ "orders": { "order_items": [ { "product_min": { "colors": [ { "media": [ { "original_url": "https://royalpetiq.com/royalpet2/public//storage/10628/msg5212971698-890.jpg" } ] } ] } } ] } }
方法一:手动逐层解析
直接通过键名逐级访问,每一步都做空值判断避免报错:
void parseJson(String jsonString) { // 将JSON字符串转为Map结构 final Map<String, dynamic> data = jsonDecode(jsonString); // 逐层获取数据,加入空判断防止崩溃 final orders = data['orders'] as Map<String, dynamic>?; final orderItems = orders?['order_items'] as List<dynamic>?; if (orderItems != null && orderItems.isNotEmpty) { final firstOrderItem = orderItems[0] as Map<String, dynamic>?; final productMin = firstOrderItem?['product_min'] as Map<String, dynamic>?; final colors = productMin?['colors'] as List<dynamic>?; if (colors != null && colors.isNotEmpty) { final firstColor = colors[0] as Map<String, dynamic>?; final mediaList = firstColor?['media'] as List<dynamic>?; if (mediaList != null && mediaList.isNotEmpty) { final mediaItem = mediaList[0] as Map<String, dynamic>?; final originalUrl = mediaItem?['original_url'] as String?; if (originalUrl != null) { print('获取到original_url: $originalUrl'); // 此处可直接使用该URL } } } } }
方法二:使用模型类解析(推荐)
借助 json_serializable 插件生成强类型模型,代码更安全易维护:
- 在
pubspec.yaml添加依赖:
dependencies: json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.0
- 创建模型类文件(比如
order_model.dart):
import 'package:json_annotation/json_annotation.dart'; part 'order_model.g.dart'; @JsonSerializable() class OrderResponse { final Orders orders; OrderResponse({required this.orders}); factory OrderResponse.fromJson(Map<String, dynamic> json) => _$OrderResponseFromJson(json); Map<String, dynamic> toJson() => _$OrderResponseToJson(this); } @JsonSerializable() class Orders { final List<OrderItem> order_items; Orders({required this.order_items}); factory Orders.fromJson(Map<String, dynamic> json) => _$OrdersFromJson(json); Map<String, dynamic> toJson() => _$OrdersToJson(this); } @JsonSerializable() class OrderItem { final ProductMin product_min; OrderItem({required this.product_min}); factory OrderItem.fromJson(Map<String, dynamic> json) => _$OrderItemFromJson(json); Map<String, dynamic> toJson() => _$OrderItemToJson(this); } @JsonSerializable() class ProductMin { final List<ColorItem> colors; ProductMin({required this.colors}); factory ProductMin.fromJson(Map<String, dynamic> json) => _$ProductMinFromJson(json); Map<String, dynamic> toJson() => _$ProductMinToJson(this); } @JsonSerializable() class ColorItem { final List<MediaItem> media; ColorItem({required this.media}); factory ColorItem.fromJson(Map<String, dynamic> json) => _$ColorItemFromJson(json); Map<String, dynamic> toJson() => _$ColorItemToJson(this); } @JsonSerializable() class MediaItem { final String original_url; MediaItem({required this.original_url}); factory MediaItem.fromJson(Map<String, dynamic> json) => _$MediaItemFromJson(json); Map<String, dynamic> toJson() => _$MediaItemToJson(this); }
- 运行命令生成序列化代码:
flutter pub run build_runner build
- 使用模型类解析 JSON:
void parseJsonWithModel(String jsonString) { final orderResponse = OrderResponse.fromJson(jsonDecode(jsonString)); // 逐层获取数据,加入空判断 if (orderResponse.orders.order_items.isNotEmpty) { final firstItem = orderResponse.orders.order_items[0]; if (firstItem.product_min.colors.isNotEmpty) { final firstColor = firstItem.product_min.colors[0]; if (firstColor.media.isNotEmpty) { final originalUrl = firstColor.media[0].original_url; print('获取到original_url: $originalUrl'); } } } }
关键注意点
- 必须先修正 JSON 的语法错误,否则
jsonDecode会直接抛出异常 - 实际开发中所有列表、Map 的访问都要做空值判断,避免空指针崩溃
- 如果 JSON 中部分字段可能不存在,模型类里可将对应字段设为可空类型(比如
String? original_url)
内容的提问来源于stack exchange,提问作者Kawan Idris
相关产品推荐
相关产品推荐

