Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在flatter/dart中解析JSON_Arrays_Json_Parsing_Flutter_Dart - Fatal编程技术网

Arrays 在flatter/dart中解析JSON

Arrays 在flatter/dart中解析JSON,arrays,json,parsing,flutter,dart,Arrays,Json,Parsing,Flutter,Dart,您好,我正在尝试解析这种类型的json: { "records": [ { "id": "recHSxuQBgXAkT9HR", "fields": { "Entry ID": "00663", "Date ID": "12-12", "(Gregorian) Year": " ?", "(Cop

您好,我正在尝试解析这种类型的json:


{
    "records": [
        {
            "id": "recHSxuQBgXAkT9HR",
            "fields": {
                "Entry ID": "00663",
                "Date ID": "12-12",
                "(Gregorian) Year": " ?",
                "(Coptic) Month": "12-Mesori",
                "(Coptic) Day": "14",
                "Event Category": [
                    "Commemoration"
                ],
                "Event Heading": "Heading01",
                "Name 01 - Title": "Mr.",
                "Name 01 - Name in English": "Jhon",            
                "Name 01 - Suffix": "23rd Pa",
                "DayText": "On this day,..",
                "Name 01 - Gender": "Male",
                "Name 01 - Classification": [
                    "08 - Patriarch of Alexandria"
                ],
                "Number of Saints Mentioned": 1,
                "Regnal Number": "I",
                "Apostolic Throne": "385-412",
                "Entry Title": "Commemoration of "
            },
            "createdTime": "2020-04-27T05:30:53.000Z"
        },
        {
            "id": "rec3gTgUKo5Co9Qi3",
            "fields": {
                "Entry ID": "00450",
                "Date ID": "08-Paremoude - D30 - 0450",
                "Century": "1st Century",
                "(Gregorian) Year": "68",
                "(Coptic) Month": "08-Paremoud",
                "(Coptic) Day": "30",
                "Event Category": [
                    "Martyrdom"
                ],
                "Event Heading": "Martyrdom of ",
                "Name 01 - Title": "Saint",
                "Name 01 - Name in English": "Mark",
                "Name 01 - Pronoun": "the",
                "Name 01 - Suffix": "Evangelis",
                "DayText": "On this day 2",
                "Name 01 - Gender": "Male",
                "Name 01 - Classification": [
                    "06 - Apostles Order",
                    "07 - Martyrs Order",
                    "08 - Patriarch of Alexandri"
                ],
                "Number of Saints Mentioned": 1,
                "Entry Title": "Martyrdo of the Evangelist ()                                 "
            },
            "createdTime": "2020-04-27T05:30:53.000Z"
        },
这是我获取记录的方法:

  Future<Record> _getRecords() async {
    var response = await http.get(Uri.encodeFull("url"),
        headers: {
          "Authorization": "**********",
          "Accept": "application/json"
        });

    Record record;
    if(response == 200) {
      var jsonData = json.decode(response.body);
      record = Record.fromJson(jsonData);
    }else{
      print(response.statusCode);
    }


    return record;
  }

Future\u getRecords()异步{
var response=wait http.get(Uri.encodeFull(“url”),
标题:{
“授权”:“**********”,
“接受”:“应用程序/json”
});
记录;
如果(响应==200){
var jsonData=json.decode(response.body);
record=record.fromJson(jsonData);
}否则{
打印(响应状态码);
}
返回记录;
}
我不知道如何格式化记录类,结束目前从服务器收到422错误,任何帮助都会很好谢谢。我需要为每个数组单独设置类吗?我需要打开后一个按钮才能将数据放入ListView。。。 我也不确定我是否正确地包含了API密钥以进行授权?
Tnx

服务器端应该有更多信息或导致422错误的请求。你可能想检查一下

为了回答您的问题,由于数据是
记录的列表
,因此
\u getRecords
函数应该更像这样

Future\u getRecords()异步{
var response=wait http.get(
Uri.encodeFull(“url”),
标题:{
“授权”:“**********”,
“接受”:“应用程序/json”,
},
);
列出记录;
如果(response.statusCode==200){
var jsonData=json.decode(response.body)??[];
records=jsonData.map(Record.fromJson.toList();
}否则{
打印(响应状态码);
}
退货记录;
}

您可以复制粘贴运行下面的完整代码
您可以查看完整代码中的
记录
类定义,并使用
FutureBuilder

代码片段

Record recordFromJson(String str) => Record.fromJson(json.decode(str));
... 
if (response.statusCode == 200) {
  return recordFromJson(jsonString);
...
@override
  void initState() {
    _future = _getRecords();

... 
FutureBuilder(
            future: _future,
            builder: (context, AsyncSnapshot<Record> snapshot) {
              switch (snapshot.connectionState) {
Record-recordFromJson(String-str)=>Record.fromJson(json.decode(str));
... 
如果(response.statusCode==200){
返回recordFromJson(jsonString);
...
@凌驾
void initState(){
_future=_getRecords();
... 
未来建设者(
未来:未来,
生成器:(上下文,异步快照){
交换机(快照.连接状态){
工作演示

完整代码

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

Record recordFromJson(String str) => Record.fromJson(json.decode(str));

String recordToJson(Record data) => json.encode(data.toJson());

class Record {
  List<RecordElement> records;

  Record({
    this.records,
  });

  factory Record.fromJson(Map<String, dynamic> json) => Record(
        records: List<RecordElement>.from(
            json["records"].map((x) => RecordElement.fromJson(x))),
      );

  Map<String, dynamic> toJson() => {
        "records": List<dynamic>.from(records.map((x) => x.toJson())),
      };
}

class RecordElement {
  String id;
  Fields fields;
  DateTime createdTime;

  RecordElement({
    this.id,
    this.fields,
    this.createdTime,
  });

  factory RecordElement.fromJson(Map<String, dynamic> json) => RecordElement(
        id: json["id"],
        fields: Fields.fromJson(json["fields"]),
        createdTime: DateTime.parse(json["createdTime"]),
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "fields": fields.toJson(),
        "createdTime": createdTime.toIso8601String(),
      };
}

class Fields {
  String entryId;
  String dateId;
  String gregorianYear;
  String copticMonth;
  String copticDay;
  List<String> eventCategory;
  String eventHeading;
  String name01Title;
  String name01NameInEnglish;
  String name01Suffix;
  String dayText;
  String name01Gender;
  List<String> name01Classification;
  int numberOfSaintsMentioned;
  String regnalNumber;
  String apostolicThrone;
  String entryTitle;
  String century;
  String name01Pronoun;

  Fields({
    this.entryId,
    this.dateId,
    this.gregorianYear,
    this.copticMonth,
    this.copticDay,
    this.eventCategory,
    this.eventHeading,
    this.name01Title,
    this.name01NameInEnglish,
    this.name01Suffix,
    this.dayText,
    this.name01Gender,
    this.name01Classification,
    this.numberOfSaintsMentioned,
    this.regnalNumber,
    this.apostolicThrone,
    this.entryTitle,
    this.century,
    this.name01Pronoun,
  });

  factory Fields.fromJson(Map<String, dynamic> json) => Fields(
        entryId: json["Entry ID"],
        dateId: json["Date ID"],
        gregorianYear: json["(Gregorian) Year"],
        copticMonth: json["(Coptic) Month"],
        copticDay: json["(Coptic) Day"],
        eventCategory: List<String>.from(json["Event Category"].map((x) => x)),
        eventHeading: json["Event Heading"],
        name01Title: json["Name 01 - Title"],
        name01NameInEnglish: json["Name 01 - Name in English"],
        name01Suffix: json["Name 01 - Suffix"],
        dayText: json["DayText"],
        name01Gender: json["Name 01 - Gender"],
        name01Classification:
            List<String>.from(json["Name 01 - Classification"].map((x) => x)),
        numberOfSaintsMentioned: json["Number of Saints Mentioned"],
        regnalNumber:
            json["Regnal Number"] == null ? null : json["Regnal Number"],
        apostolicThrone:
            json["Apostolic Throne"] == null ? null : json["Apostolic Throne"],
        entryTitle: json["Entry Title"],
        century: json["Century"] == null ? null : json["Century"],
        name01Pronoun: json["Name 01 - Pronoun"] == null
            ? null
            : json["Name 01 - Pronoun"],
      );

  Map<String, dynamic> toJson() => {
        "Entry ID": entryId,
        "Date ID": dateId,
        "(Gregorian) Year": gregorianYear,
        "(Coptic) Month": copticMonth,
        "(Coptic) Day": copticDay,
        "Event Category": List<dynamic>.from(eventCategory.map((x) => x)),
        "Event Heading": eventHeading,
        "Name 01 - Title": name01Title,
        "Name 01 - Name in English": name01NameInEnglish,
        "Name 01 - Suffix": name01Suffix,
        "DayText": dayText,
        "Name 01 - Gender": name01Gender,
        "Name 01 - Classification":
            List<dynamic>.from(name01Classification.map((x) => x)),
        "Number of Saints Mentioned": numberOfSaintsMentioned,
        "Regnal Number": regnalNumber == null ? null : regnalNumber,
        "Apostolic Throne": apostolicThrone == null ? null : apostolicThrone,
        "Entry Title": entryTitle,
        "Century": century == null ? null : century,
        "Name 01 - Pronoun": name01Pronoun == null ? null : name01Pronoun,
      };
}

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  Future<Record> _future;

  Future<Record> _getRecords() async {
    /*var response = await http.get(Uri.encodeFull("url"),
        headers: {
          "Authorization": "**********",
          "Accept": "application/json"
        });
*/
    String jsonString = '''
    {
    "records": [
        {
            "id": "recHSxuQBgXAkT9HR",
            "fields": {
                "Entry ID": "00663",
                "Date ID": "12-12",
                "(Gregorian) Year": " ?",
                "(Coptic) Month": "12-Mesori",
                "(Coptic) Day": "14",
                "Event Category": [
                    "Commemoration"
                ],
                "Event Heading": "Heading01",
                "Name 01 - Title": "Mr.",
                "Name 01 - Name in English": "Jhon",            
                "Name 01 - Suffix": "23rd Pa",
                "DayText": "On this day,..",
                "Name 01 - Gender": "Male",
                "Name 01 - Classification": [
                    "08 - Patriarch of Alexandria"
                ],
                "Number of Saints Mentioned": 1,
                "Regnal Number": "I",
                "Apostolic Throne": "385-412",
                "Entry Title": "Commemoration of "
            },
            "createdTime": "2020-04-27T05:30:53.000Z"
        },
        {
            "id": "rec3gTgUKo5Co9Qi3",
            "fields": {
                "Entry ID": "00450",
                "Date ID": "08-Paremoude - D30 - 0450",
                "Century": "1st Century",
                "(Gregorian) Year": "68",
                "(Coptic) Month": "08-Paremoud",
                "(Coptic) Day": "30",
                "Event Category": [
                    "Martyrdom"
                ],
                "Event Heading": "Martyrdom of ",
                "Name 01 - Title": "Saint",
                "Name 01 - Name in English": "Mark",
                "Name 01 - Pronoun": "the",
                "Name 01 - Suffix": "Evangelis",
                "DayText": "On this day 2",
                "Name 01 - Gender": "Male",
                "Name 01 - Classification": [
                    "06 - Apostles Order",
                    "07 - Martyrs Order",
                    "08 - Patriarch of Alexandri"
                ],
                "Number of Saints Mentioned": 1,
                "Entry Title": "Martyrdo of the Evangelist ()                                 "
            },
            "createdTime": "2020-04-27T05:30:53.000Z"
        }
        ]
}
    ''';

    var response = http.Response(jsonString, 200);

    if (response.statusCode == 200) {
      return recordFromJson(jsonString);
    } else {
      print(response.statusCode);
    }
  }

  @override
  void initState() {
    _future = _getRecords();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: FutureBuilder(
            future: _future,
            builder: (context, AsyncSnapshot<Record> snapshot) {
              switch (snapshot.connectionState) {
                case ConnectionState.none:
                  return Text('none');
                case ConnectionState.waiting:
                  return Center(child: CircularProgressIndicator());
                case ConnectionState.active:
                  return Text('');
                case ConnectionState.done:
                  if (snapshot.hasError) {
                    return Text(
                      '${snapshot.error}',
                      style: TextStyle(color: Colors.red),
                    );
                  } else {
                    return ListView.builder(
                        itemCount: snapshot.data.records.length,
                        itemBuilder: (context, index) {
                          return Card(
                              elevation: 6.0,
                              child: Padding(
                                padding: const EdgeInsets.only(
                                    top: 6.0,
                                    bottom: 6.0,
                                    left: 8.0,
                                    right: 8.0),
                                child: Row(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                    Text(
                                      snapshot.data.records[index].fields
                                          .eventHeading,
                                    ),
                                    Spacer(),
                                    Text(
                                      snapshot.data.records[index].fields
                                          .name01NameInEnglish,
                                    ),
                                  ],
                                ),
                              ));
                        });
                  }
              }
            }));
  }
}
导入“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
导入“dart:convert”;
Record recordFromJson(String str)=>Record.fromJson(json.decode(str));
字符串recordToJson(记录数据)=>json.encode(data.toJson());
课堂记录{
列出记录;
记录({
这是我的记录,
});
工厂记录.fromJson(映射json)=>记录(
记录:List.from(
json[“records”].map((x)=>RecordElement.fromJson(x)),
);
映射到JSON()=>{
“记录”:List.from(records.map((x)=>x.toJson()),
};
}
类记录元素{
字符串id;
田地;
DateTime createdTime;
记录元素({
这个身份证,
这是我的地盘,
这个.createdTime,
});
factory RecordElement.fromJson(映射json)=>RecordElement(
id:json[“id”],
fields:fields.fromJson(json[“fields”]),
createdTime:DateTime.parse(json[“createdTime”]),
);
映射到JSON()=>{
“id”:id,
“字段”:fields.toJson(),
“createdTime”:createdTime.toIso8601String(),
};
}
类字段{
字符串入口ID;
字符串日期ID;
弦格里高利年;
弦连音月;
弦科普提克日;
列出事件类别;
字符串事件标题;
字符串名称01标题;
字符串名称01nameinenglish;
字符串名称后缀;
字符串dayText;
字符串名称和性别;
清单名称和分类;
提及的整数;
字符串regnalNumber;
字符串撇号;
字符串入口标题;
弦乐世纪;
串名代词;
田地({
这是恩特里德,
这是dateId,
今年,格雷戈里年,
这个月,
这一天,
这个.eventCategory,
这是一个事件标题,
这个.name01标题,
这是英语中的,
这个.name01后缀,
这是dayText,
这是性别,
这是我的分类,
上面提到的这个数字,
这个.regnalNumber,
这个,使徒时代,
这个.入口标题,
这个世纪,,
这个.name01代词,
});
工厂字段.fromJson(映射json)=>字段(
entryId:json[“条目ID”],
dateId:json[“日期ID”],
公历年:json[“(公历)年],
科普特月:json[“(科普特)月”],
科普特语日:json[“(科普特语)日”],
eventCategory:List.from(json[“事件类别”].map((x)=>x)),
eventHeading:json[“事件标题”],
name01Title:json[“Name 01-Title”],
name01 nameinenglish:json[“Name 01-Name in English”],
name01后缀:json[“Name 01-Suffix”],
dayText:json[“dayText”],
name01Gender:json[“Name 01-Gender”],
名称01分类:
List.from(json[“Name 01-Classification”].map((x)=>x)),
NumberOfsantsMonted:json[“提及的圣徒数量”],
注册表号:
json[“Regnal Number”]==null?null:json[“Regnal Number”],
变节时期:
json[“使徒宝座”]==null?null:json[“使徒宝座”],
entryTitle:json[“条目标题”],
世纪:json[“世纪”]==null?null:json[“世纪”],
name01代词:json[“Name 01-deon”]==null
无效的
:json[“名称01-代词”],
);
映射到JSON()=>{
“入口ID”:入口ID,
“日期ID”:日期ID,
“(公历)年”:公历年,
“(科普特)月”:科普特月,
“科普特日”:科普特日,
“事件类别”:列表.from(eventCategory.map((x)=>x)),
“事件标题”:事件标题,
“名称01-标题”:名称01标题,
“名称01-英语名称”:名称01英语名称,
“名称01-后缀”:名称01后缀,
“DayText”:DayText,
“姓名01-性别”:姓名01性别,
“名称01-分类”:
List.from(name01Classification.map((x)=>x)),
“提到的圣徒人数”:提到的圣徒人数,
“Regnal Number”:regnalNumber==null?