skip to Main Content

So I have open api json response of model:

    {
    "object": "list",
    "data": [
       {
            "id": "whisper-1",
            "object": "model",
            "created": 1677532384,
            "owned_by": "openai-internal",
            "permission": [
                {
                    "id": "modelperm-KlsZlfft3Gma8pI6A8rTnyjs",
                    "object": "model_permission",
                    "created": 1683912666,
                    "allow_create_engine": false,
                    "allow_sampling": true,
                    "allow_logprobs": true,
                    "allow_search_indices": false,
                    "allow_view": true,
                    "allow_fine_tuning": false,
                    "organization": "*",
                    "group": null,
                    "is_blocking": false
                }
            ],
            "root": "whisper-1",
            "parent": null
        },
    ]
 }

And here is the data model classes:

import 'package:flutter_chatgpt/src/data/models/model_model.dart';

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,
  });
  late final String id;
  late final String object;
  
  Model.fromJson(Map<String, dynamic> json){
    id = json['id'];
    object = json['object'];
  }

  Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
    data['id'] = id;
    data['object'] = object;
    return data;
  }
}

But upon the API request when I pass in the data to the fromJson() of ModelResponse, I get this error:

Exception: Failed to fetch models: type '_Map<String, dynamic>' is not a subtype of type 'String'

Seems like getting the response from the API but the function is not able to properly parse the JSON and convert it into the object. I don’t know what is causing it.

2

Answers


  1. Please try this ModelResponse class, based on your json (model created from quicktype):

    import 'dart:convert';
    
    class ModelResponse {
      final String object;
      final List<Datum> data;
    
      ModelResponse({
        required this.object,
        required this.data,
      });
    
      factory ModelResponse.fromRawJson(String str) => ModelResponse.fromJson(json.decode(str));
    
      String toRawJson() => json.encode(toJson());
    
      factory ModelResponse.fromJson(Map<String, dynamic> json) => ModelResponse(
            object: json["object"],
            data: List<Datum>.from(json["data"].map((x) => Datum.fromJson(x))),
          );
    
      Map<String, dynamic> toJson() => {
            "object": object,
            "data": List<dynamic>.from(data.map((x) => x.toJson())),
          };
    }
    
    class Datum {
      final String id;
      final String object;
      final int created;
      final String ownedBy;
      final List<Permission> permission;
      final String root;
      final dynamic parent;
    
      Datum({
        required this.id,
        required this.object,
        required this.created,
        required this.ownedBy,
        required this.permission,
        required this.root,
        required this.parent,
      });
    
      factory Datum.fromRawJson(String str) => Datum.fromJson(json.decode(str));
    
      String toRawJson() => json.encode(toJson());
    
      factory Datum.fromJson(Map<String, dynamic> json) => Datum(
            id: json["id"],
            object: json["object"],
            created: json["created"],
            ownedBy: json["owned_by"],
            permission: List<Permission>.from(json["permission"].map((x) => Permission.fromJson(x))),
            root: json["root"],
            parent: json["parent"],
          );
    
      Map<String, dynamic> toJson() => {
            "id": id,
            "object": object,
            "created": created,
            "owned_by": ownedBy,
            "permission": List<dynamic>.from(permission.map((x) => x.toJson())),
            "root": root,
            "parent": parent,
          };
    }
    
    class Permission {
      final String id;
      final String object;
      final int created;
      final bool allowCreateEngine;
      final bool allowSampling;
      final bool allowLogprobs;
      final bool allowSearchIndices;
      final bool allowView;
      final bool allowFineTuning;
      final String organization;
      final dynamic group;
      final bool isBlocking;
    
      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,
      });
    
      factory Permission.fromRawJson(String str) => Permission.fromJson(json.decode(str));
    
      String toRawJson() => json.encode(toJson());
    
      factory Permission.fromJson(Map<String, dynamic> json) => Permission(
            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() => {
            "id": id,
            "object": object,
            "created": created,
            "allow_create_engine": allowCreateEngine,
            "allow_sampling": allowSampling,
            "allow_logprobs": allowLogprobs,
            "allow_search_indices": allowSearchIndices,
            "allow_view": allowView,
            "allow_fine_tuning": allowFineTuning,
            "organization": organization,
            "group": group,
            "is_blocking": isBlocking,
          };
    }
    

    then use :

    ModelResponse m = ModelResponse.fromRawJson(yourResponseDataAsString);
    
    Login or Signup to reply.
  2. Update your model class to this :

    class ModelResponse {
      String? object;
      List<PermissionData>? data;
    
      ModelResponse({this.object, this.data});
    
      ModelResponse.fromJson(Map<String, dynamic> json) {
        object = json['object'];
        if (json['data'] != null) {
          data = <PermissionData>[];
          json['data'].forEach((v) {
            data!.add(PermissionData.fromJson(v));
          });
        }
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = <String, dynamic>{};
        data['object'] = object;
        if (this.data != null) {
          data['data'] = this.data!.map((v) => v.toJson()).toList();
        }
        return data;
      }
    }
    
    class PermissionData {
      String? id;
      String? object;
      int? created;
      String? ownedBy;
      List<Permission>? permission;
      String? root;
      dynamic parent;
    
      PermissionData(
          {this.id,
          this.object,
          this.created,
          this.ownedBy,
          this.permission,
          this.root,
          this.parent});
    
      PermissionData.fromJson(Map<String, dynamic> json) {
        id = json['id'];
        object = json['object'];
        created = json['created'];
        ownedBy = json['owned_by'];
        if (json['permission'] != null) {
          permission = <Permission>[];
          json['permission'].forEach((v) {
            permission!.add(Permission.fromJson(v));
          });
        }
        root = json['root'];
        parent = json['parent'];
      }
    
      Map<String, dynamic> toJson() {
        final Map<String, dynamic> data = <String, dynamic>{};
        data['id'] = id;
        data['object'] = object;
        data['created'] = created;
        data['owned_by'] = ownedBy;
        if (permission != null) {
          data['permission'] = permission!.map((v) => v.toJson()).toList();
        }
        data['root'] = root;
        data['parent'] = parent;
        return data;
      }
    }
    
    class Permission {
      String? id;
      String? object;
      int? created;
      bool? allowCreateEngine;
      bool? allowSampling;
      bool? allowLogprobs;
      bool? allowSearchIndices;
      bool? allowView;
      bool? allowFineTuning;
      String? organization;
      dynamic group;
      bool? isBlocking;
    
      Permission(
          {this.id,
          this.object,
          this.created,
          this.allowCreateEngine,
          this.allowSampling,
          this.allowLogprobs,
          this.allowSearchIndices,
          this.allowView,
          this.allowFineTuning,
          this.organization,
          this.group,
          this.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 Map<String, dynamic> 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;
      }
    }
    

    Then use :

    ModelResponse.fromJson(yourResponseString);
    

    Link to generate model classes is Json to Dart Model Class

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search