Flutter--網絡請求(二)Json轉換dart對象

JSON轉換成Dart對象

  • 假設請求的返回的JSON數據如下
{“id" : 12345, "title" : "titleName"}
  • 對應的dart對象
class Article {
    final String title;
    // dynamic表示不知道傳進去什麼類型
    Artilce.fromJson(Map<String, dynamic> json) {
        id = json['id'];
        title = json['title'];
    }
}
  • 注意:
    • 在請求響應回來時,通過json.decode(responseData)可以將JSON結果轉換成一個Map類型(對應JSON對象)或者List類型(對應JSON數組)

使用Json工具生成實體類

  • 在pubspec.yaml中引入下面的庫
dependencies:
    json_annotation: 3.0.1

dev_dependencies:
    build_runner: 1.8.0
    json_serializable: 3.2.5
  • 創建實體類

import 'package:json_annotation/json_annotation.dart';

// 此時此處會報錯,別急下面會作出處理
part 'home_article.g.dart';


// 首先使用註解聲明
@JsonSerializable()
class HomeArticle extends Object {
  // 使用JsonKey註解目的:有時實體類中的屬性和服務器返回的Json字段是不同的,可以通過該註解指向正確的接口字段
  @JsonKey(name: 'curPage')
  int curPage;

  @JsonKey(name: 'datas')
  List<Article> datas;


  @JsonKey(name: 'offset')
  int offset;

  @JsonKey(name: 'over')
  bool over;

  @JsonKey(name: 'pageCount')
  int pageCount;

  @JsonKey(name: 'size')
  int size;

  @JsonKey(name: 'total')
  int total;

  HomeArticle(
    this.curPage,
    this.datas,
    this.offset,
    this.over,
    this.pageCount,
    this.size,
    this.total,
  );

  factory HomeArticle.fromJson(Map<String, dynamic> srcJson) =>
      _$HomeArticleFromJson(srcJson);

  Map<String, dynamic> toJson() => _$HomeArticleToJson(this);
}
  • 生成fromJson和toJson方法
在terminal中輸入命令:
flutter packages pub run build_runner build
  • 執行命令生成以下文件
// GENERATED CODE - DO NOT MODIFY BY HAND


part of 'home_article.dart';


// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************


HomeArticle _$HomeArticleFromJson(Map<String, dynamic> json) {
  return HomeArticle(
    json['curPage'] as int,
    (json['datas'] as List)
        ?.map((e) =>
            e == null ? null : Article.fromJson(e as Map<String, dynamic>))
        ?.toList(),
    json['offset'] as int,
    json['over'] as bool,
    json['pageCount'] as int,
    json['size'] as int,
    json['total'] as int,
  );
}


Map<String, dynamic> _$HomeArticleToJson(HomeArticle instance) =>
    <String, dynamic>{
      'curPage': instance.curPage,
      'datas': instance.datas,
      'offset': instance.offset,
      'over': instance.over,
      'pageCount': instance.pageCount,
      'size': instance.size,
      'total': instance.total,
    };
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章