You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 插件生成强类型模型,代码更安全易维护:

  1. 在 pubspec.yaml 添加依赖:
dependencies:
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0
  1. 创建模型类文件(比如 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);
}
  1. 运行命令生成序列化代码:
flutter pub run build_runner build
  1. 使用模型类解析 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 13:35:34