如何在颤振中解析复杂的json

问题描述 投票:0回答:3

我从一个复杂的json获取数据时遇到了麻烦,这里是json

{
   "results":{
      "TotalRecordCount":"1",
      "Records":[
         {
            "code":"PCK_34333338365C93E2D50DB9C",
            "address":"1 AV KHEIREDDINE PACHA Imm Pacha centre BLOC B tunis Tunis 1000",
            "contact_phone":"99608258"
         }
      ],
      "Result":"OK"
   }
}

这就是我制作的模型

import 'dart:convert';
class Pickup {
String status;
List message;
//Map<String ,dynamic> results;
Results results;
Pickup(
{this.status,
this.message,
this.results,
});
factory Pickup.fromJson(Map<String, dynamic> json) {
return Pickup(
status: json["status"] as String,
results: Results.fromJson(json["results"]),

);
}
}

class Results{
String TotalRecordCount;
records Records;

Results({this.TotalRecordCount,this.Records});

factory Results.fromJson(Map<String, dynamic> json) {
return Results(
TotalRecordCount: json["TotalRecordCount"],
Records:records.fromJson(json["Records"]),

);
}
}

class records{
String code;
String address;
String contact_phone;

records({this.code,this.address,this.contact_phone});
factory records.fromJson(Map<String, dynamic> json) {
return records(
code: json["code"],
address: json["address"],
contact_phone: json["contact_phone"],

);
}
}

现在我试图解析记录以获取代码或adresse并打印它

if(response.statusCode == 200)
{
print(response.body);
final responseJson = json.decode(response.body);
var da=Pickup.fromJson(responseJson);
Results dat=da.results;
records data=dat.Records;
print(data.address);

response.body工作正常但是当我尝试解析结果或记录时我得到'List'不是'Map'类型的子类型错误

arrays json list dart flutter
3个回答

0
投票

如何做到这一点的一个例子。

import 'dart:convert';

import 'json_objects.dart';

void main() {
  final responseJson = json.decode(responseBody) as Map<String, dynamic>;
  var da = Pickup.fromJson(responseJson);
  Results dat = da.results;
  List<ResultsRecords> data = dat.records;
  print(data[0].address);
}

var responseBody = '''
{
   "results":{
      "TotalRecordCount":"1",
      "Records":[
         {
            "code":"PCK_34333338365C93E2D50DB9C",
            "address":"1 AV KHEIREDDINE PACHA Imm Pacha centre BLOC B tunis Tunis 1000",
            "contact_phone":"99608258"
         }
      ],
      "Result":"OK"
   }
}''';

结果:

1 AV KHEIREDDINE PACHA Imm Pacha centre BLOC B tunis Tunis 1000

使用过的数据模型的源代码。

class Pickup {
  final Results results;

  Pickup({this.results});

  factory Pickup.fromJson(Map<String, dynamic> json) {
    return Pickup(
      results: _toObject(json['results'], (e) => Results.fromJson(e)),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'results': results?.toJson(),
    };
  }
}

class Results {
  final List<ResultsRecords> records;
  final String result;
  final String totalRecordCount;

  Results({this.records, this.result, this.totalRecordCount});

  factory Results.fromJson(Map<String, dynamic> json) {
    return Results(
      records:
          _toObjectList(json['Records'], (e) => ResultsRecords.fromJson(e)),
      result: json['Result'] as String,
      totalRecordCount: json['TotalRecordCount'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'Records': _fromList(records, (e) => e.toJson()),
      'Result': result,
      'TotalRecordCount': totalRecordCount,
    };
  }
}

class ResultsRecords {
  final String address;
  final String code;
  final String contactPhone;

  ResultsRecords({this.address, this.code, this.contactPhone});

  factory ResultsRecords.fromJson(Map<String, dynamic> json) {
    return ResultsRecords(
      address: json['address'] as String,
      code: json['code'] as String,
      contactPhone: json['contact_phone'] as String,
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'address': address,
      'code': code,
      'contact_phone': contactPhone,
    };
  }
}

List _fromList(data, Function(dynamic) toJson) {
  if (data == null) {
    return null;
  }
  var result = [];
  for (var element in data) {
    var value;
    if (element != null) {
      value = toJson(element);
    }
    result.add(value);
  }
  return result;
}

T _toObject<T>(data, T Function(Map<String, dynamic>) fromJson) {
  if (data == null) {
    return null;
  }
  return fromJson(data as Map<String, dynamic>);
}

List<T> _toObjectList<T>(data, T Function(Map<String, dynamic>) fromJson) {
  if (data == null) {
    return null;
  }
  var result = <T>[];
  for (var element in data) {
    T value;
    if (element != null) {
      value = fromJson(element as Map<String, dynamic>);
    }
    result.add(value);
  }
  return result;
}

/*
Pickup:
  "results": Results

Results:
  "TotalRecordCount": String
  "Records": List<ResultsRecords>
  "Result": String

ResultsRecords:
  "code": String
  "address": String
  "contact_phone": String
*/


0
投票

我一定会推荐你这个网站json dart App Quicktype只是不要忘记在右侧选择Dart。

你只需将你的json放在左边,然后就会给你这样的东西:

// To parse this JSON data, do
//
//     final pickUp = pickUpFromJson(jsonString);

import 'dart:convert';

PickUp pickUpFromJson(String str) => PickUp.fromJson(json.decode(str));

String pickUpToJson(PickUp data) => json.encode(data.toJson());

class PickUp {
    Results results;

    PickUp({
        this.results,
    });

    factory PickUp.fromJson(Map<String, dynamic> json) => new PickUp(
        results: Results.fromJson(json["results"]),
    );

    Map<String, dynamic> toJson() => {
        "results": results.toJson(),
    };
}

class Results {
    String totalRecordCount;
    List<Record> records;
    String result;

    Results({
        this.totalRecordCount,
        this.records,
        this.result,
    });

    factory Results.fromJson(Map<String, dynamic> json) => new Results(
        totalRecordCount: json["TotalRecordCount"],
        records: new List<Record>.from(json["Records"].map((x) => Record.fromJson(x))),
        result: json["Result"],
    );

    Map<String, dynamic> toJson() => {
        "TotalRecordCount": totalRecordCount,
        "Records": new List<dynamic>.from(records.map((x) => x.toJson())),
        "Result": result,
    };
}

class Record {
    String code;
    String address;
    String contactPhone;

    Record({
        this.code,
        this.address,
        this.contactPhone,
    });

    factory Record.fromJson(Map<String, dynamic> json) => new Record(
        code: json["code"],
        address: json["address"],
        contactPhone: json["contact_phone"],
    );

    Map<String, dynamic> toJson() => {
        "code": code,
        "address": address,
        "contact_phone": contactPhone,
    };
}

一开始它会告诉你如何使用它。

// To parse this JSON data, do
//
//     final pickUp = pickUpFromJson(jsonString);

因此,当你在代码中调用它时,它会是这样的。

  Future<Pickup> getPickup() async {
    var response = await http.get(url);
    return pickUpFromJson(response.body);
  }

例如,可以为FutureBuilder调用此代码,也可以将代码设置为等待将来。

© www.soinside.com 2019 - 2024. All rights reserved.