Home > database >  How can i convert a JSON String to List<String> in flutter?
How can i convert a JSON String to List<String> in flutter?

Time:08-18

I`m trying to retrieve the content of a table from oracle apex to my flutter app with http.get method, and atribute the values to a class i created. Problem is that 3 of the atributes of this class need to be List, so, when i try to map it, it returns this error: [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: type 'String' is not a subtype of type 'List' in type cast.

this is the JSON:

{
    "items": [
        {
            "id": "1",
            "nome": "Feijão Tropeiro",
            "id_dia_da_semana": "seg",
            "id_categoria": "ga",
            "url_da_imagem": "https://live.staticflickr.com/65535/52180505297_2c23a61620_q.jpg",
            "ingredientes": "vários nadas"
        }
    ],

and this is the class:

// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:convert';

class Meal {
  final String id;
  final String descricao;
  final List<String> ingredients;
  final List<String> idDiaSem;
  final List<String> idCategory;
  final String imageUrl;

  const Meal({
    required this.id,
    required this.descricao,
    required this.ingredients,
    required this.idDiaSem,
    required this.idCategory,
    required this.imageUrl,
  });

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'id': id,
      'nome': descricao,
      'ingredientes': ingredients,
      'id_dia_da_semana': idDiaSem,
      'id_categoria': idCategory,
      'url_da_imagem': imageUrl,
    };
  }

  factory Meal.fromMap(Map<String, dynamic> map) {
    return Meal(
      id: map['id'] as String,
      descricao: map['nome'] as String,
      ingredients: map['ingredientes'] as List<String>,
      idDiaSem: map['id_dia_da_semana'] as List<String>,
      idCategory: map['id_categoria'] as List<String>,
      imageUrl: map['url_da_imagem'] as String,
    );
  }

  String toJson() => json.encode(toMap());

  factory Meal.fromJson(String source) =>
      Meal.fromMap(json.decode(source) as Map<String, dynamic>);
}

can anyone help me please to fix this error? i`ve tried to convert it unsuccessfully

CodePudding user response:

You can't cast them to List<String> because they simply aren't a list. If you want them to be a List with a single element you could do this instead:

  ingredients: [map['ingredientes'] as String],
  idDiaSem: [map['id_dia_da_semana'] as String],
  idCategory: [map['id_categoria'] as String],

or make sure the JSON has them as list like

{
"items": [
    {
        "id": "1",
        "nome": "Feijão Tropeiro",
        "id_dia_da_semana": ["seg"],
        "id_categoria": ["ga"],
        "url_da_imagem": "https://live.staticflickr.com/65535/52180505297_2c23a61620_q.jpg",
        "ingredientes": ["vários nadas"]
    }
],

CodePudding user response:

try this:

static List<Meal> fromMap(Map<String, dynamic> map) {
    List<Meal> result = [];
    for(var item in map['items']){
result.add(Meal(
      id: item['id'] as String,
      descricao: item['nome'] as String,
      ingredients: item['ingredientes'] as String,
      idDiaSem: item['id_dia_da_semana'] as String,
      idCategory: item['id_categoria'] as String,
      imageUrl: item['url_da_imagem'] as String,
    ))
}
    return result;
  }

CodePudding user response:

class Meal {
  final String id;
  final String descricao;
  final List<String> ingredients;
  final List<String> idDiaSem;
  final List<String> idCategory;
  final String imageUrl;

  const Meal({
    required this.id,
    required this.descricao,
    required this.ingredients,
    required this.idDiaSem,
    required this.idCategory,
    required this.imageUrl,
  });

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'id': id,
      'nome': descricao,
      'ingredientes': ingredients.isNotEmpty ? ingredients[0] : '',
      'id_dia_da_semana': idDiaSem.isNotEmpty ? idDiaSem[0] : '',
      'id_categoria': idCategory.isNotEmpty ? idCategory[0] : '',
      'url_da_imagem': imageUrl,
    };
  }

  factory Meal.fromMap(Map<String, dynamic> map) {
    return Meal(
      id: map['id'] as String,
      descricao: map['nome'] as String,
      ingredients: [map['ingredientes'] as String],
      idDiaSem: [map['id_dia_da_semana'] as String],
      idCategory: [map['id_categoria'] as String],
      imageUrl: map['url_da_imagem'] as String,
    );
  }
}

Please try this this might be helpful

CodePudding user response:

When you have a string you want to parse to a list, there should be a separator. For example, let's suppose this strings:

// The separator here is a comma with a space, like ', '
String str1 = 'ingredient1, ingredient2, bread, idunno, etc';
// The separator here is a simple space, ' '
String str2 = 'ingredient1 ingredient2 bread idunno etc';

Once you identified the separator in the string, you may want to use the string split method in dart, specifying the separator. For example:

// Separator is a simple comma with no spaces, ','
String str1 = 'ingredient1,ingredient2,bread,idunno,etc';
// Splits the string into array by the separator
List<String> strList = str1.split(','); 
// strList = ['ingredient1', 'ingredient2', 'bread', 'idunno', 'etc'];

More information on the split dart method at https://api.dart.dev/stable/2.14.4/dart-core/String/split.html

  • Related