Flutter数据处理插件ndjson的使用

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

Flutter数据处理插件ndjson的使用

Tiny and simple ndjson parser library for Dart. No external dependencies.

安装

pubspec.yaml文件中添加以下依赖:

dependencies:
  ndjson: ^<latest-version>

然后导入包:

import 'package:ndjson/ndjson.dart';

使用

使用方式非常简单:

import 'package:ndjson/ndjson.dart';

// Your ndjson stream.
final Stream<String|List<int>> ndjsonStream = ...;

// A new stream that will parse all chunks and emit events 
// for each new json object (not ndjson chunks).
final Stream<NdjsonLine> parsedNdjson = ndjsonStream.parseNdjson();

// Using converter functions:
final Stream<Dummy> ndjson = ndjsonSource.parseNdjsonWithConverter<
  Dummy>(
  whenMap: Dummy.fromJson,
);

支持的ndjson类型

  • Stream<List<int>>
  • Stream<Uint8List>
  • Stream<String>

将任何列表类型的ndjson源转换为Stream

Stream.fromIterable(ndjsonList);

请注意,将ndjson作为列表使用等同于普通的json(您会失去所有ndjson的性能优势)。

示例代码

以下是完整的示例代码:

import 'dart:io';

import 'package:ndjson/ndjson.dart';

final File ndjsonValidSample = File('./data/object.ndjson');
Stream<List<int>> get ndjsonSource =&gt; ndjsonValidSample.openRead();

void main() async {
  await _usingFunction();
  await _usingExtension();
  await _usingExtensionWithConverter();
}

Future<void> _usingFunction() async {
  // 使用函数解析ndjson
  final Stream<NdjsonLine> ndjson = parseNdjson(byteStream: ndjsonSource);

  print(await ndjson.toList());
}

Future<void> _usingExtension() async {
  // 使用扩展方法解析ndjson
  final Stream<NdjsonLine> ndjson = ndjsonSource.parseNdjson();

  print(await ndjson.toList());
}

Future<void> _usingExtensionWithConverter() async {
  // 使用带有转换器的方法解析ndjson
  final Stream<Dummy> ndjson = ndjsonSource.parseNdjsonWithConverter<
    Dummy>(
    whenMap: Dummy.fromJson,
  );

  print(await ndjson.toList());
}

class Dummy {
  const Dummy(this.id, this.name);

  factory Dummy.fromJson(Map<String, dynamic> map) {
    return Dummy(map['id'] as int, map['name'] as String);
  }

  final int id;
  final String name;
}

以上示例展示了如何使用ndjson插件来解析不同类型的ndjson数据,并提供了带有转换器的方法来解析特定类型的对象。


更多关于Flutter数据处理插件ndjson的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据处理插件ndjson的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中处理NDJSON(Newline Delimited JSON)数据,你可以使用ndjson插件。这个插件允许你逐行解析NDJSON数据,非常适合处理大规模数据流。以下是一个简单的代码示例,展示了如何使用ndjson插件来读取和解析NDJSON数据。

首先,确保你已经在pubspec.yaml文件中添加了ndjson依赖:

dependencies:
  flutter:
    sdk: flutter
  ndjson: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,是一个完整的Flutter应用示例,它展示了如何使用ndjson插件来读取和解析NDJSON数据:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'dart:io';
import 'package:ndjson/ndjson.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('NDJSON Example'),
        ),
        body: Center(
          child: NDJSONDemo(),
        ),
      ),
    );
  }
}

class NDJSONDemo extends StatefulWidget {
  @override
  _NDJSONDemoState createState() => _NDJSONDemoState();
}

class _NDJSONDemoState extends State<NDJSONDemo> {
  List<Map<String, dynamic>> data = [];

  @override
  void initState() {
    super.initState();
    _loadNDJSONData();
  }

  Future<void> _loadNDJSONData() async {
    // 假设你有一个包含NDJSON数据的文件
    final File file = File('path/to/your/ndjson/file.ndjson');
    
    // 使用ndjson解码器逐行读取文件
    final Stream<Map<String, dynamic>> stream = file.openRead().transform(ndjson.decoder);

    stream.listen(
      (jsonData) {
        // 每次读取到一行数据,将其添加到列表中
        setState(() {
          data.add(jsonData);
        });
      },
      onDone: () {
        // 所有数据读取完成后,可以在这里做一些处理
        print('Data loading complete.');
      },
      onError: (error) {
        // 处理读取错误
        print('Error reading NDJSON data: $error');
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: data.length,
      itemBuilder: (context, index) {
        final item = data[index];
        // 假设每个JSON对象都有一个`name`字段
        return ListTile(
          title: Text(item['name'] ?? 'No Name'),
        );
      },
    );
  }
}

在这个示例中:

  1. 我们创建了一个Flutter应用,并在MyApp中设置了主页面。
  2. NDJSONDemo是一个有状态的组件,它负责加载和显示NDJSON数据。
  3. _NDJSONDemoStateinitState方法中,我们调用_loadNDJSONData方法来加载NDJSON数据。
  4. _loadNDJSONData方法打开一个包含NDJSON数据的文件,并使用ndjson.decoder逐行解析数据。
  5. 解析到的每一行数据都会被添加到data列表中,并触发UI更新。
  6. 最后,我们使用ListView.builder来显示解析到的数据。

请确保将'path/to/your/ndjson/file.ndjson'替换为你实际的NDJSON文件路径。如果你的NDJSON数据来自网络或其他流,你可以相应地调整代码来读取这些数据源。

回到顶部