javascript
c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化
前言
Flutter 中沒有類似于 Java 中 Gson/Jackson 這樣的 JSON 序列化庫。
因為這些庫都是通過反射實現的,而 Flutter 中不支持反射。
其實 Dart 是支持反射的,只是 Flutter 禁用了而已。
Flutter 在 release 版本中會去除沒有使用的代碼,優化包大小。由于反射默認應用到所有代碼,所以如果支持反射的話,就沒法判斷反射代碼有沒有被使用了。
dart 中的 JSON 處理
dart 中的 JSON 處理用到了核心庫 dart:convert。
import 'dart:convert';
jsonDecode() 用來把 JSON 轉化為 Map 或 List
看一下官方提供的例子:
var jsonString = '''
[
{"score": 40},
{"score": 80}
]
''';
var scores = jsonDecode(jsonString);
assert(scores is List);
var firstScore = scores[0];
assert(firstScore is Map);
assert(firstScore['score'] == 40);
jsonEncode() 用來把 Map 或 List 轉化為 JSON
看一下官方提供的例子:
var scores = [
{'score': 40},
{'score': 80},
{'score': 100, 'overtime': true, 'special_guest': null}
];
var jsonText = jsonEncode(scores);
assert(jsonText ==
'[{"score":40},{"score":80},'
'{"score":100,"overtime":true,'
'"special_guest":null}]');
jsonDecode() 和 jsonEncode() 只支持 JSON 和 Map/List 之間的轉換。如果要支持 JSON 和 Model 類之間的轉換,需要自己實現方法去解析。
例如:
class User {
final String name;
final int age;
User({this.name, this.age});
User.fromJson(Map json)
: name = json['name'],
age = json['age'];
Map toJson() => {
'name': name,
'age': age,
};
}
JSON 簡單還好,如果 JSON 復雜的話,編寫解析代碼既耗時又容易出錯。幸運的是,官方提供了自動生成解析代碼的庫。
自動生成解析代碼
json_serializable 就是官方提供的自動生成解析代碼的庫。
添加依賴:
dependencies:
# 定義 json_serializable 庫用到的一些注解
json_annotation: 3.0.1
dev_dependencies:
# 代碼生成器
build_runner: 1.10.0
# 根據注解生成 Json 序列化和反序列化代碼
json_serializable: 3.3.0
代碼生成的相關庫不需要打包進 release 版本,所以添加到 dev_dependencies 下。
添加注解并指定生成的類名:
import 'package:json_annotation/json_annotation.dart';
part 'User.g.dart';
@JsonSerializable()
class User {
final String name;
final int age;
User({this.name, this.age});
}
用 @JsonSerializable() 修飾的 Model 類表示需要 JSON 序列化,之后執行相關命令會自動生成代碼。
part 指定自動生成的類的名稱。
執行命令生成相關代碼:
flutter pub run build_runner build
執行完命令可以看到 User.g.dart 被生成了,_$UserFromJson 方法和 _$UserToJson 方法分別為反序列化和序列化的代碼。
接下來我們修改 Model 類直接調用生成的代碼:
import 'package:json_annotation/json_annotation.dart';
part 'User.g.dart';
@JsonSerializable()
class User {
final String name;
final int age;
User({this.name, this.age});
factory User.fromJson(Map json) => _$UserFromJson(json);
Map toJson() => _$UserToJson(this);
}
當 Model 類有改動時,需要重新執行上述命令生成相關代碼。
如果需要持續觀察 Model 類的改動自動生成相應代碼,可以執行如下命令:
flutter pub run build_runner watch
只需啟動一次 watcher,它就會在后臺運行,一旦 Model 類有改動,就會生成相應代碼。
總結
以上是生活随笔為你收集整理的c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 先进技术android,React Na
- 下一篇: Java实现动态加载页面_[Java教程