【问题标题】:How can i convert a JSON String to List<String> in flutter?如何在颤动中将 JSON 字符串转换为 List<String>?
【发布时间】:2022-08-18 19:20:50
【问题描述】:

我正在尝试使用 http.get 方法将表的内容从 oracle apex 检索到我的颤振应用程序,并将这些值归因于我创建的类。问题是这个类的3个属性需要是List,所以,当我尝试映射它时,它返回这个错误:[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: type \ 'String\' 不是类型转换中类型 \'List\' 的子类型。

这是 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\"
        }
    ],

这是课程:

// 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>);
}

谁能帮我解决这个错误?我试图转换它不成功

  • 为什么将字符串值解析为 List<String> ?
  • 因为 Json 将值作为字符串返回,因为我使用 http.get 方法从数据库中获取它,并且我最终需要这些列中的多个项目,例如: \"ingredientes: one, two,三等\"

标签: json flutter dart get type-conversion


【解决方案1】:

您不能将它们投射到List&lt;String&gt;,因为它们根本不是一个列表。如果您希望它们成为具有单个元素的List,您可以这样做:

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

或确保 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"]
    }
],

【讨论】:

    【解决方案2】:

    尝试这个:

    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;
      }
    

    【讨论】:

      【解决方案3】:

      当您有一个要解析为列表的字符串时,应该有一个分隔符。例如,让我们假设这个字符串:

      // 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';
      

      一旦你确定了字符串中的分隔符,你可能想在 dart 中使用字符串 split 方法,指定分隔符。例如:

      // 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'];
      

      有关split dart 方法的更多信息,请访问https://api.dart.dev/stable/2.14.4/dart-core/String/split.html

      编辑:以您的代码为例,假设属性ingredients 是一个表示字符串数组的字符串,用“,”分隔:

      factory Meal.fromMap(Map<String, dynamic> map) {
          return Meal(
            id: map['id'] as String,
            descricao: map['nome'] as String,
            ingredients: (map['ingredientes'] as String).split(','),
            // ...
      

      【讨论】:

      • 你能告诉我一个如何在我的代码中实现它的例子吗?
      • @pedro.curti 在您的代码中添加了一个适当的示例。
      猜你喜欢
      • 2020-11-25
      • 2020-09-15
      • 2021-09-14
      • 2020-08-11
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多