在Flutter中从API解析JSON数据时出现问题

时间:2019-07-27 10:12:08

标签: json flutter

我正在尝试使用express和mongodb从node.js中的REST API解析json数据,然后将其显示为userdata。问题是无论我尝试了什么,它都不会解析将抛出的数据和异常之类的数据 未处理的异常:NoSuchMethodError:类'_InternalLinkedHashMap'没有实例方法'cast'具有匹配的参数。 或仅显示空值。我正在尝试解析此json数据: {“ userData”:{“ _ id”:“ 5d3c29fdb1b0fd22182ae683”,“ personName”:“ Damian”,“ userIdentificationEMAIL”:“ dbonda@gmail.com”,“ dateofbirth”:“ 14.07.2000”,“ grad”:“丢失Angeles“,” postanskibroj“:” 2B“,” ulica“:” Jackovina“,” drzava“:” California“,” faiID“:” 123456789“,” nacionalniID“:” 000“},” request“:{”类型“:” GET“,” url“:” http://localhost:3000/products“}} 我只是不知道是否需要对json数据中的request字段进行实际操作,我不知道是否应将其忽略……有人评论说它是错误地提出要求的。另外,当从API获取数据时,我可以将整个userData放入数组中。

我尝试了quicktype,但无济于事,我尝试了很多示例和方法,这些方法都是从堆栈(通常是从网络)开始的,但是我什么也没找到。

我正在设法从API中获取数据,但未能真正进行解析,然后使用它向用户显示其数据。

// To parse this JSON data, do
//
//     final userData = userDataFromJson(jsonString);

import 'dart:convert';

UserData userDataFromJson(String str) => UserData.fromJson(json.decode(str));

String userDataToJson(UserData data) => json.encode(data.toJson());

class UserData {
    List<UserDatum> userData;
    Request request;

    UserData({
        this.userData,
        this.request,
    });

    factory UserData.fromJson(Map<String, dynamic> json) => new UserData(
        userData: new List<UserDatum>.from(json["userData"].map((x) => UserDatum.fromJson(x))),
        request: Request.fromJson(json["request"]),
    );

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

class Request {
    String type;
    String url;

    Request({
        this.type,
        this.url,
    });

    factory Request.fromJson(Map<String, dynamic> json) => new Request(
        type: json["type"],
        url: json["url"],
    );

    Map<String, dynamic> toJson() => {
        "type": type,
        "url": url,
    };
}

class UserDatum {
    String id;
    String personName;
    String userIdentificationEmail;
    String dateofbirth;
    String iDPhoto;
    String grad;
    String postanskibroj;
    String ulica;
    String drzava;
    String faiId;
    String nacionalniId;

    UserDatum({
        this.id,
        this.personName,
        this.userIdentificationEmail,
        this.dateofbirth,
        this.iDPhoto,
        this.grad,
        this.postanskibroj,
        this.ulica,
        this.drzava,
        this.faiId,
        this.nacionalniId,
    });

    factory UserDatum.fromJson(Map<String, dynamic> json) => new UserDatum(
        id: json["_id"],
        personName: json["personName"],
        userIdentificationEmail: json["userIdentificationEMAIL"],
        dateofbirth: json["dateofbirth"],
        iDPhoto: json["iDPhoto"],
        grad: json["grad"],
        postanskibroj: json["postanskibroj"],
        ulica: json["ulica"],
        drzava: json["drzava"],
        faiId: json["faiID"],
        nacionalniId: json["nacionalniID"],
    );

    Map<String, dynamic> toJson() => {
        "_id": id,
        "personName": personName,
        "userIdentificationEMAIL": userIdentificationEmail,
        "dateofbirth": dateofbirth,
        "iDPhoto": iDPhoto,
        "grad": grad,
        "postanskibroj": postanskibroj,
        "ulica": ulica,
        "drzava": drzava,
        "faiID": faiId,
        "nacionalniID": nacionalniId,
    };
}

我只需要解析数据并将其显示在列表或文本中,然后就可以将其放入变量中并在整个应用程序中使用它。 任何帮助是极大的赞赏。 谢谢。 干杯!

2 个答案:

答案 0 :(得分:0)

您的syntax error中有json data

我检查了您在问题中发布的数据。

尝试通过访问为您的课程生成飞镖代码 here

您将首先获得Autogenerated类,然后获得子类。

编辑


当您通过发布无错误的json代码更改问题时,更改了一点答案


您可以重命名Autogenerated类,但请确保也通过以下方法对其进行更改

然后传递您的json数据,使其功能如下所述

fetchData() async{
  Response response;
  response = await get("yourURL");
  var json = jsonDecode(response.body);
  List<Autogenerated> _userDataList = Autogenerated.fromJson(json); 
}

答案 1 :(得分:0)

将JSON文本更改为包含JSON数组后,您的代码应该可以使用。

按如下所示更改工厂构造函数会更为优雅:

  factory UserData.fromJson(Map<String, dynamic> json) => UserData(
        userData: json["userData"]
            .map<UserDatum>((x) => UserDatum.fromJson(x))
            .toList(),
        request: Request.fromJson(json["request"]),
      );

访问如下字段:

  print(UserData.fromJson(decode).userData[0].dateofbirth);
相关问题