Flutter BSON数据处理插件bson的使用
Flutter BSON数据处理插件bson的使用
bson库简介
bson
是一个用于Dart编程语言的Bson库。版本5.0.0引入了破坏性API更改,详情请参阅变更日志。
这个包允许将Dart元素的地图转换为二进制Bson表示形式,反之亦然。输入可以是标准的Dart地图(键名为值和值本身),或者是ejson表示的值,或混合源。它还可以序列化使用BsonSerializable混入的对象。
存在一个Codec类,可以根据来源定义要执行的序列化类型,以及三个预设参数的专门类:BsonCodec、EjsonCodec和ObjectCode。
BSON转换
支持的数据类型
Dart Type | Internal Type | Bson Byte | Returned internal | Returned Dart | Notes |
---|---|---|---|---|---|
double | BsonDouble | 1 / 0x01 | BsonDouble | double | |
String | BsonString | 2 / 0x02 | BsonString | String | |
Map | BsonMap | 3 / 0x03 | BsonMap | Map | |
DbRef | BsonDbRef | Map convention | BsonDbRef | DbRef | 包含"$id"和"$ref"键的Map |
List | BsonArray | 4 / 0x04 | BsonArray | List | |
LegacyUuid | BsonLegacyUuid | 5 / 0x05 | BsonLegacyUuid | LegacyUuid | 子类型3 / 0x03 |
UuidValue | BsonUuid | 5 / 0x05 | BsonUuid | UuidValue | 子类型4 / 0x04 |
ObjectId | BsonObjectId | 7 / 0x07 | BsonObjectId | ObjectId | |
bool | BsonBoolean | 8 / 0x08 | BsonBoolean | bool | |
DateTime | BsonDate | 9 / 0x09 | BsonDate | DateTime | |
Null | BsonNull | 10 / 0x0A | BsonNull | Null | |
RegExp | BsonRegexp | 11 / 0x0B | BsonRegexp | RegExp | |
DBPointer | DBPointer | 12 / 0x0C | DBPointer | DBPointer | @Deprecated |
JsCode | BsonCode | 13 / 0x0D | BsonCode | JsCode | |
int | BsonInt | 16 / 0x10 | BsonInt | int | 当bitLength <= 31时 |
Int32 | BsonInt | 16 / 0x10 | BsonInt | int | |
Timestamp | BsonTimestamp | 17 / 0x11 | BsonTimestamp | Timestamp | |
int | BsonLong | 18 / 0x12 | BsonLong | Int64 | 当bitLength > 31时 |
Int64 | BsonLong | 18 / 0x12 | BsonLong | Int64 | |
Decimal | BsonDecimal128 | 19 / 0x13 | BsonDecimal128 | Decimal |
序列化和反序列化示例代码
import 'package:bson/bson.dart';
import 'package:fixnum/fixnum.dart';
void main() {
var objectId = ObjectId.parse('51c87a81a58a563d1304f4ed');
var document = <String, dynamic>{
'_id': objectId,
'int32': 78954,
'int64': Int64(-1),
'date': DateTime(2020),
'map': {
'a': 99,
'subList': [Int64(1), Int64(2), Int64(3)]
},
'list': [
1,
2,
3,
{'b': 29}
]
};
// 序列化
var bsonBinary = BsonCodec.serialize(document);
// 反序列化
var result = BsonCodec.deserialize(bsonBinary);
// 检查结果是否正确
var checkValue = result['list'][3]['b'] == document['list'][3]['b'];
print('The result is ${checkValue ? 'correct' : 'uncorrect'}');
}
EJSON转换
EJSON支持从格式为ejson的文档转换为BSON格式,仅支持ejson版本2。支持的数据类型与BSON类似,但有一些特定的EJSON表示方法,如$numberDouble
、$oid
等。
序列化和反序列化示例代码
import 'package:bson/bson.dart';
import 'package:fixnum/fixnum.dart';
void main() {
var ejsonMap = <String, dynamic>{
'_id': {'$oid': '51c87a81a58a563d1304f4ed'},
'int32': {'$numberInt': '78954'},
'int64': {'$numberLong': '-1'},
'date': {'$date': '2020-01-01T00:00:00Z'},
'map': {
'a': 99,
'subList': [{'$numberLong': '1'}, {'$numberLong': '2'}, {'$numberLong': '3'}]
},
'list': [
1,
2,
3,
{'b': 29}
]
};
// 序列化
var bsonBinary = EJsonCodec.serialize(ejsonMap);
// 反序列化
var result = EJsonCodec.deserialize(bsonBinary, relaxed: true);
// 检查结果是否正确
var checkValue = result['list'][3]['b'] == ejsonMap['list'][3]['b'];
print('The result is ${checkValue ? 'correct' : 'uncorrect'}');
}
Dart对象转换
可以通过实现BsonSerializable
混入来将Dart对象转换为BSON格式。需要满足以下条件:
- 对象必须使用
BsonSerializable
混入。 - 覆盖
toBson
方法,在其中为每个字段提供相应的值。 - 注册类,并提供用于重新创建实例的方法。
示例代码
import 'package:bson/bson.dart';
import 'package:fixnum/fixnum.dart';
class MyObject with BsonSerializable {
final ObjectId id;
final int value;
MyObject(this.id, this.value);
@override
Map<String, dynamic> toBson() => {
'_id': id,
'value': value,
};
static MyObject fromBson(Map<String, dynamic> bson) {
return MyObject(
bson['_id'] as ObjectId,
bson['value'] as int,
);
}
}
void main() {
var myObject = MyObject(ObjectId(), 42);
ObjectCodec.registerClass(MyObject.fromBson, 1);
// 序列化
var bsonBinary = myObject.serialize();
// 反序列化
var result = ObjectCodec.deserialize(bsonBinary) as MyObject;
// 检查结果是否正确
var checkValue = result.value == myObject.value;
print('The result is ${checkValue ? 'correct' : 'uncorrect'}');
}
通过上述内容,您可以了解如何在Flutter项目中使用bson
插件进行BSON数据的处理。希望这些信息对您有所帮助!
更多关于Flutter BSON数据处理插件bson的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter BSON数据处理插件bson的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,我可以为你提供一个关于如何在Flutter中使用bson
插件来处理BSON(Binary JSON)数据的示例。bson
是MongoDB中使用的一种二进制编码格式,用于存储和传输文档数据。在Flutter中,你可以通过bson
插件来解析和生成BSON数据。
首先,你需要在你的pubspec.yaml
文件中添加bson
依赖:
dependencies:
flutter:
sdk: flutter
bson: ^x.y.z # 请将 x.y.z 替换为最新的版本号
然后,运行flutter pub get
来安装依赖。
以下是一个简单的示例,展示如何在Flutter中使用bson
插件来处理BSON数据:
import 'package:bson/bson.dart';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String bsonData = '';
String parsedData = '';
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('BSON Data Processing'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'BSON Data'),
maxLines: 10,
controller: TextEditingController(text: bsonData),
onChanged: (value) {
setState(() {
bsonData = value;
});
},
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () {
try {
// 将输入的BSON数据转换为Uint8List
Uint8List bsonBytes = Uint8List.fromList(bsonData.codeUnits);
// 解析BSON数据
BsonDocument bsonDocument = BsonDocument.fromData(bsonBytes);
// 将解析后的数据转换为字符串显示
setState(() {
parsedData = bsonDocument.toJson();
});
} catch (e) {
setState(() {
parsedData = 'Error: ${e.toString()}';
});
}
},
child: Text('Parse BSON'),
),
SizedBox(height: 16),
Text('Parsed Data:'),
Text(parsedData),
],
),
),
),
);
}
}
注意:
-
上述代码示例中,
bsonData
字段是一个文本输入,用户可以在其中输入BSON数据的字符串表示形式。在实际应用中,BSON数据通常以二进制形式存在,这里为了简化示例,我们假设用户输入的是BSON数据的字符串表示(即UTF-8编码的字节数组转换成的字符串)。 -
Uint8List bsonBytes = Uint8List.fromList(bsonData.codeUnits);
这行代码将输入的字符串转换为一个Uint8List
,这通常不是处理实际BSON数据的正确方式。在实际应用中,你应该从文件、网络或其他二进制数据源获取BSON数据。 -
BsonDocument bsonDocument = BsonDocument.fromData(bsonBytes);
这行代码将Uint8List
解析为一个BsonDocument
对象。 -
bsonDocument.toJson();
将BsonDocument
对象转换为一个JSON字符串,以便在UI中显示。
由于BSON数据通常以二进制形式存在,并且Flutter应用通常不直接处理二进制输入,因此在实际应用中,你可能需要从文件、网络请求或其他二进制数据源中获取BSON数据,并使用相应的库或API来处理这些数据。
希望这个示例能帮你理解如何在Flutter中使用bson
插件来处理BSON数据!