从 Dart 中的 json 文件获取嵌套列表内容,但返回“'FormContent'的实例”

Dem*_*mir 6 json dart flutter

我有一个 JSON 格式的列表列表,如下所示。我需要将这些列表转换为 Flutter 中的 DropDownMenu 项。要做到这一点,

\n
    \n
  1. 从 JSON 文件中读取数据
  2. \n
  3. 将数据转换为可用的类格式(FormContent 类)
  4. \n
  5. 创建一个返回 FormContent 列表的 Future。
  6. \n
  7. 读取FutureBuilder内部的数据
  8. \n
  9. 将 FormContent 列表转换为 DropDownMenu 可以接受的字符串列表
  10. \n
\n

在打印第一项的最后items,我得到了Instance of 'FormContent'执行的结果(我在下面的 FutureBuilder 小部件中标记了它)。"stajTuru"我期待的是JSON 文件中的列表。

\n
\n

["Ortopedi", "Kardiyoloji","Dermatoloji", "Pediatri"]

\n
\n

由于存在嵌套列表格式。我尝试执行print(items[0][0].toString());以获取第一项的内容。但是,我收到这样的错误

\n
Class 'FormContent' has no instance method '[]'.Receiver: Instance of 'FormContent' Tried calling: [](0)\n
Run Code Online (Sandbox Code Playgroud)\n

总而言之,我需要将这些 JSON 内容转换为单独的List<String>. 就像我上面所期待的那样。

\n

JSON 文件

\n
[\n\n\n  {\n    "stajTuru": [  "Ortopedi", "Kardiyoloji","Dermatoloji", "Pediatri"],\n    "cinsiyet": ["Erkek","Kad\xc4\xb1n", "Di\xc4\x9fer"],\n    "etkilesimTuru": [  "G\xc3\xb6zlem", "Yard\xc4\xb1mla yapma","Yard\xc4\xb1ms\xc4\xb1z yapma","Sanal olgu"],\n    "kapsam": [  "\xc3\x96yk\xc3\xbc", "Fizik Bak\xc4\xb1", "Tan\xc4\xb1sal ak\xc4\xb1l Y\xc3\xbcr\xc3\xbctme", "Terop\xc3\xb6tik ak\xc4\xb1l y\xc3\xbcr\xc3\xbctme"],\n    "ortam": ["Poliklinik","Servis","Acil","Ameliyathane","D\xc4\xb1\xc5\x9f Kurum"],\n    "doktor": [  "Esra Demir","Mehmet U\xc3\xa7ar","Kemal Yurdakul","Fehmi \xc3\x96zt\xc3\xbcrk","Mehmet \xc3\x96z"]\n  }\n\n]\n\n
Run Code Online (Sandbox Code Playgroud)\n

表单内容类

\n

这是我的班级,我保存每个列表

\n
class FormContent{\n\n  late List<dynamic> _cinsiyetItems;\n  late List<dynamic> _stajTuruItems;\n  late List<dynamic> _etkilesimTuruItems;\n  late List<dynamic> _kapsamItems;\n  late List<dynamic> _ortamItems;\n  late List<dynamic> _doktorItems;\n\n    FormContent.fromJson(Map<String,dynamic> jsonFile){\n    _cinsiyetItems=jsonFile['cinsiyet']!.toList();\n    _stajTuruItems=jsonFile['stajTuru']!.toList();\n    _etkilesimTuruItems=jsonFile['etkilesimTuru']!.toList();\n    _kapsamItems=jsonFile['kapsam']!.toList();\n    _ortamItems=jsonFile['ortam']!.toList();\n    _doktorItems=jsonFile['doktor']!.toList();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

读取JSON的方法

\n

这是我将 JSON 数据转换为列表的方法

\n
  Future<List<dynamic>> readJsonData() async{\n    final jsonData = await rootBundle.rootBundle.loadString('assets/json/formdata.json');\n    print(jsonData.toString());\n    final list = json.decode(jsonData) as List<dynamic>;\n    print("======================================");\n    print(list.toString());\n    var result =list.map((e) => FormContent.fromJson(e)).toList();\n    print("------------------------------------------");\n    print(result.toString());\n    return result;\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

FutureBuilder方法

\n

最后,这是我的 FutureBuilder 来执行数据

\n
FutureBuilder(\n           future:readJsonData() ,\n           builder: (context,snapshot){\n             if(snapshot.hasError){\n               return Text(snapshot.error.toString());\n             }else if(snapshot.hasData){\n\n               var items =snapshot.data as List<dynamic>;\n               print("--------------***********************************");\n                 print(items[0].toString());  //                      <--- HERE\n               return\n                 ListView(\n                   children: [\n                     myTextFieldRow("Kay\xc4\xb1t No: ", 10,_formData.setKayitNo),\n                     myDropDownContainer(_valueStajTuru,_stajTuruItems,\n                         hintTextStajTuru, onChangedStajTuru),\n                     // myDropDownContainer(_valueDoktor, _doktorItems, hintTextDoktor, onChangedDoktor),\n                     myTextFieldRow("Hastan\xc4\xb1n Ya\xc5\x9f\xc4\xb1:", 3, _formData.setYas),\n                    // myDropDownContainer(_valueCinsiyet, _cinsiyetItems, hintTextCinsiyet, onChangedCinsiyet),\n                     myTextFieldRow("\xc5\x9eikayet:", 10,_formData.setSikayet),\n                     myTextFieldRow("Ay\xc4\xb1r\xc4\xb1c\xc4\xb1 Tan\xc4\xb1:", 50,_formData.setAyiriciTani),\n                     myTextFieldRow("Kesin Tan\xc4\xb1:", 50,_formData.setKesinTani),\n                     myTextFieldRow("Tedavi Y\xc3\xb6ntemi:", 100,_formData.setTedaviYontemi),\n                   //  myDropDownContainer(_valueEtkilesim, _etkilesimTuruItems, hintTextEtkilesim, onChangedEtkilesim),\n                  //   myDropDownContainer(_valueKapsam, _kapsamItems, hintTextKapsam, onChangedKapsam),\n                    // myDropDownContainer(_valueOrtam, _ortamItems, hintTextOrtam, onChangedOrtam),\n                     const SizedBox(\n                       height: 20,\n                     ),\n                     Row(\n                       mainAxisAlignment: MainAxisAlignment.end,\n                       children: [\n                         SizedBox(\n                           width: 150,\n                           height: 50,\n                           child: TextButton(\n                             onPressed: () {\n                               setState(() {\n                                 _formAdd.addNewFormToList(_formData);\n                                 _formData=FormData();\n\n                                 Navigator.push(context, MaterialPageRoute(builder: (context)=> StudentProfile(formAdd: _formAdd)));\n                               });\n                             },\n                             child: Text(\n                               "G\xc3\x96NDER",\n                               style: kTextStyle.copyWith(fontSize: 20),\n                             ),\n                             style: ButtonStyle(\n                               backgroundColor: MaterialStateProperty.all<Color>(\n                                 const Color(0xff4F4DBB),\n                               ),\n                             ),\n                           ),\n                         ),\n                       ],\n                     ),\n                   ],\n                 );\n             } else{\n               return const Center(child:CircularProgressIndicator(),);\n             }\n          }\n         )),\n\n
Run Code Online (Sandbox Code Playgroud)\n

mmc*_*n20 2

首先,你的FormContent课程需要以某种方式重新设计。类中的所有内容当前都是私有的,这不让您有任何方式获取类中包含的数据。此外,您还可以通过提供列表类型List<String>而不是 来更具体List<dynamic>,并且也不需要创建属性late。这是我建议的课程重写:

class FormContent {
  List<String> cinsiyetItems;
  List<String> stajTuruItems;
  List<String> etkilesimTuruItems;
  List<String> kapsamItems;
  List<String> ortamItems;
  List<String> doktorItems;

  FormContent.fromJson(Map<String, dynamic> jsonFile)
      : cinsiyetItems = [...?jsonFile['cinsiyet']],
        stajTuruItems = [...?jsonFile['stajTuru']],
        etkilesimTuruItems = [...?jsonFile['etkilesimTuru']],
        kapsamItems = [...?jsonFile['kapsam']],
        ortamItems = [...?jsonFile['ortam']],
        doktorItems = [...?jsonFile['doktor']];
}
Run Code Online (Sandbox Code Playgroud)

至于您的readJsonData函数,您应该通过将类型指定为而Future<List<FormContent>>不是 来更加具体Future<List<dynamic>>。我会重写如下:

Future<List<FormContent>> readJsonData() async {
  final jsonData = await rootBundle.rootBundle.loadString('assets/json/formdata.json');
  return [
    for (final e in json.decode(jsonData)) FormContent.fromJson(e),
  ];
}
Run Code Online (Sandbox Code Playgroud)

对于这个问题:

在打印第一项的最后,我得到了“FormContent”的实例作为执行的结果(我在下面的 FutureBuilder 小部件中标记了它)。我期待的是 JSON 文件中的“stajTuru”列表。

您只需打印出您从中获得的第一个元素,readJsonData该元素是您的类的实例FormContent。您可以print(items[0].stajTuruItems);查看stajTuru打印出来的列表。