javascript
c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化
前言
Flutter 中沒(méi)有類似于 Java 中 Gson/Jackson 這樣的 JSON 序列化庫(kù)。
因?yàn)檫@些庫(kù)都是通過(guò)反射實(shí)現(xiàn)的,而 Flutter 中不支持反射。
其實(shí) Dart 是支持反射的,只是 Flutter 禁用了而已。
Flutter 在 release 版本中會(huì)去除沒(méi)有使用的代碼,優(yōu)化包大小。由于反射默認(rèn)應(yīng)用到所有代碼,所以如果支持反射的話,就沒(méi)法判斷反射代碼有沒(méi)有被使用了。
dart 中的 JSON 處理
dart 中的 JSON 處理用到了核心庫(kù) dart:convert。
import 'dart:convert';
jsonDecode() 用來(lái)把 JSON 轉(zhuǎn)化為 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() 用來(lái)把 Map 或 List 轉(zhuǎn)化為 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 之間的轉(zhuǎn)換。如果要支持 JSON 和 Model 類之間的轉(zhuǎn)換,需要自己實(shí)現(xiàn)方法去解析。
例如:
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 簡(jiǎn)單還好,如果 JSON 復(fù)雜的話,編寫解析代碼既耗時(shí)又容易出錯(cuò)。幸運(yùn)的是,官方提供了自動(dòng)生成解析代碼的庫(kù)。
自動(dòng)生成解析代碼
json_serializable 就是官方提供的自動(dòng)生成解析代碼的庫(kù)。
添加依賴:
dependencies:
# 定義 json_serializable 庫(kù)用到的一些注解
json_annotation: 3.0.1
dev_dependencies:
# 代碼生成器
build_runner: 1.10.0
# 根據(jù)注解生成 Json 序列化和反序列化代碼
json_serializable: 3.3.0
代碼生成的相關(guān)庫(kù)不需要打包進(jìn) 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 序列化,之后執(zhí)行相關(guān)命令會(huì)自動(dòng)生成代碼。
part 指定自動(dòng)生成的類的名稱。
執(zhí)行命令生成相關(guān)代碼:
flutter pub run build_runner build
執(zhí)行完命令可以看到 User.g.dart 被生成了,_$UserFromJson 方法和 _$UserToJson 方法分別為反序列化和序列化的代碼。
接下來(lái)我們修改 Model 類直接調(diào)用生成的代碼:
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);
}
當(dāng) Model 類有改動(dòng)時(shí),需要重新執(zhí)行上述命令生成相關(guān)代碼。
如果需要持續(xù)觀察 Model 類的改動(dòng)自動(dòng)生成相應(yīng)代碼,可以執(zhí)行如下命令:
flutter pub run build_runner watch
只需啟動(dòng)一次 watcher,它就會(huì)在后臺(tái)運(yùn)行,一旦 Model 類有改動(dòng),就會(huì)生成相應(yīng)代碼。
總結(jié)
以上是生活随笔為你收集整理的c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 先进技术android,React Na
- 下一篇: java调用构造函数中某一个值_Java