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

Dart解析OpenAI模型JSON响应时遇类型不匹配错误

问题原因

你导入的model_model.dart文件中存在另一个Model类,和当前文件定义的Model类产生命名冲突,导致ModelResponse在解析时使用了错误的Model类,该类可能包含字段类型定义错误(例如将permission这类Map/List类型字段定义为String),从而触发类型不匹配错误。

解决方案

1. 移除冲突导入

删掉ModelResponse类顶部的import 'package:flutter_chatgpt/src/data/models/model_model.dart';语句,当前文件已经定义了所需的Model类,无需重复导入。

2. (可选)完善Model类(如需解析完整字段)

如果需要完整解析OpenAI返回的模型数据,可以扩展Model类并新增Permission类,代码如下:

class ModelResponse {
  ModelResponse({
    required this.object,
    required this.data,
  });
  late final String object;
  late final List<Model> data;
  
  ModelResponse.fromJson(Map<String, dynamic> json){
    object = json['object'];
    data = List.from(json['data']).map((e)=>Model.fromJson(e)).toList();
  }

  Map<String, dynamic> toJson() {
    final _data = <String, dynamic>{};
    _data['object'] = object;
    _data['data'] = data.map((e)=>e.toJson()).toList();
    return _data;
  }
}

class Model {
  Model({
    required this.id,
    required this.object,
    required this.created,
    required this.ownedBy,
    required this.permission,
    required this.root,
    required this.parent,
  });
  late final String id;
  late final String object;
  late final int created;
  late final String ownedBy;
  late final List<Permission> permission;
  late final String root;
  late final String? parent;
  
  Model.fromJson(Map<String, dynamic> json){
    id = json['id'];
    object = json['object'];
    created = json['created'];
    ownedBy = json['owned_by'];
    permission = List.from(json['permission']).map((e)=>Permission.fromJson(e)).toList();
    root = json['root'];
    parent = json['parent'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['id'] = id;
    data['object'] = object;
    data['created'] = created;
    data['owned_by'] = ownedBy;
    data['permission'] = permission.map((e)=>e.toJson()).toList();
    data['root'] = root;
    data['parent'] = parent;
    return data;
  }
}

class Permission {
  Permission({
    required this.id,
    required this.object,
    required this.created,
    required this.allowCreateEngine,
    required this.allowSampling,
    required this.allowLogprobs,
    required this.allowSearchIndices,
    required this.allowView,
    required this.allowFineTuning,
    required this.organization,
    required this.group,
    required this.isBlocking,
  });
  late final String id;
  late final String object;
  late final int created;
  late final bool allowCreateEngine;
  late final bool allowSampling;
  late final bool allowLogprobs;
  late final bool allowSearchIndices;
  late final bool allowView;
  late final bool allowFineTuning;
  late final String organization;
  late final dynamic group;
  late final bool isBlocking;
  
  Permission.fromJson(Map<String, dynamic> json){
    id = json['id'];
    object = json['object'];
    created = json['created'];
    allowCreateEngine = json['allow_create_engine'];
    allowSampling = json['allow_sampling'];
    allowLogprobs = json['allow_logprobs'];
    allowSearchIndices = json['allow_search_indices'];
    allowView = json['allow_view'];
    allowFineTuning = json['allow_fine_tuning'];
    organization = json['organization'];
    group = json['group'];
    isBlocking = json['is_blocking'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['id'] = id;
    data['object'] = object;
    data['created'] = created;
    data['allow_create_engine'] = allowCreateEngine;
    data['allow_sampling'] = allowSampling;
    data['allow_logprobs'] = allowLogprobs;
    data['allow_search_indices'] = allowSearchIndices;
    data['allow_view'] = allowView;
    data['allow_fine_tuning'] = allowFineTuning;
    data['organization'] = organization;
    data['group'] = group;
    data['is_blocking'] = isBlocking;
    return data;
  }
}

3. 确保API响应解析流程正确

发起请求时,务必将响应体解码为Map<String, dynamic>后再传入ModelResponse.fromJson,示例代码:

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<ModelResponse> fetchModels() async {
  final response = await http.get(
    Uri.parse('https://api.openai.com/v1/models'),
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
  );

  if (response.statusCode == 200) {
    final jsonData = json.decode(response.body);
    return ModelResponse.fromJson(jsonData);
  } else {
    throw Exception('Failed to fetch models: ${response.statusCode}');
  }
}

内容的提问来源于stack exchange,提问作者Takshak Rajput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:35:17