Flutter BSON数据处理插件bson的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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

1 回复

更多关于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),
            ],
          ),
        ),
      ),
    );
  }
}

注意

  1. 上述代码示例中,bsonData字段是一个文本输入,用户可以在其中输入BSON数据的字符串表示形式。在实际应用中,BSON数据通常以二进制形式存在,这里为了简化示例,我们假设用户输入的是BSON数据的字符串表示(即UTF-8编码的字节数组转换成的字符串)。

  2. Uint8List bsonBytes = Uint8List.fromList(bsonData.codeUnits); 这行代码将输入的字符串转换为一个Uint8List,这通常不是处理实际BSON数据的正确方式。在实际应用中,你应该从文件、网络或其他二进制数据源获取BSON数据。

  3. BsonDocument bsonDocument = BsonDocument.fromData(bsonBytes); 这行代码将Uint8List解析为一个BsonDocument对象。

  4. bsonDocument.toJson();BsonDocument对象转换为一个JSON字符串,以便在UI中显示。

由于BSON数据通常以二进制形式存在,并且Flutter应用通常不直接处理二进制输入,因此在实际应用中,你可能需要从文件、网络请求或其他二进制数据源中获取BSON数据,并使用相应的库或API来处理这些数据。

希望这个示例能帮你理解如何在Flutter中使用bson插件来处理BSON数据!

回到顶部