Flutter實體與JSON解析的一種方法


vs code作為編輯器

1. 首先,json對象與字符串的轉換是使用json.encode和json.decode的,需要導入import 'dart:convert';

 這里主要的自然不是這個,而是json對象和實體對象的轉換

   當然,實際上json對象算是一個Map對象,直接通過鍵訪問就可以得到值,即通過實體對象的屬性名就可以得到值。
  這里只是把這一步通過命令生成而已

2. 導入對應的flutter包

即在pubspec.yaml中添加

dependencies:
  json_annotation: ^3.0.0
dev_dependencies:
  build_runner: ^1.0.0
  json_serializable: ^3.2.0
保存將自動加載,或者終端輸入flutter packages get,亦或者vs code中點擊“查看-命令面板”再輸入Flutterget就會出現
 
3. 創建實體的dart文件,下面以news為例 —— 可以用 https://caijinglong.github.io/json2dart/index_ch.html生成
import ' package:json_annotation/json_annotation.dart'; //注意必須導入,不然無法使用@JsonSerializable()

part " news.g.dart"; //嚴格區分大小寫,且必須是文件名中間加上g. ,否則無法成功。另外也是必須的,因為要生成一個轉換部分文件

@JsonSerializable()//注意加上,后面命令識別用
class News extends Object {
  final String author;
  final String title;
  final String description;
  final String url;
  final String urlToImage;
  final String publishedAt;
  final Source source;

  News(this.author,
      this.title,
      this.description,
      this.url,
      this.urlToImage,
      this.publishedAt,
      this.source);
}
 
4. 終端輸入命令 flutter packages pub run build_runner build
等到成功,每個json序列化都將會有一個輸出

 這樣就生成好了一個轉換類news.g.dart,此時轉換文件中有_$NewsFromJson方法

你會發現竟然是報錯的??那是因為你主類中缺少了命名式構造函數,加上即可

factory News.fromJson(Map<String, dynamic> json) => _$NewsFromJson(json);
5. 這樣,你就可以通過命名構造函數從json對象轉換為實體對象了
6. 當然還要說說缺陷和坑:
  1)泛型無法成功
  2)最好確定文件名后再執行命令,不然重命名可能會發生很難解決的事情
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM