日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

c语言josn序列化和反序列化,Flutter 中 JSON 的序列化和反序列化

發布時間:2025/3/11 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 的序列化和反序列化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。