Flutter JSON解析插件generic_json_parser的使用

Flutter JSON解析插件generic_json_parser的使用

Generic Json Parser 是一个用于解析 JSON 数据的通用工具库,包括使用 compute() 函数进行后台解析。

特性

  • 解析 JSON 数据列表。
  • 解析 JSON 数据对象。
  • 在后台解析 JSON 数据列表。
  • 在后台解析 JSON 数据对象。

使用方法

1. 添加包依赖到 pubspec.yaml

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

dependencies:
  generic_json_parser: ^0.0.1

2. 导入包

在 Dart 文件中导入 generic_json_parser 包:

import 'package:generic_json_parser/generic_json_parser.dart';

3. 创建模型类

创建一个表示 JSON 数据的模型类。例如,定义一个 Photo 类:

class Photo {
  final int albumId;
  final int id;
  final String title;
  final String url;
  final String thumbnailUrl;

  const Photo({
    required this.albumId,
    required this.id,
    required this.title,
    required this.url,
    required this.thumbnailUrl,
  });

  factory Photo.fromJson(Map<String, dynamic> json) {
    return Photo(
      albumId: json['albumId'] as int,
      id: json['id'] as int,
      title: json['title'] as String,
      url: json['url'] as String,
      thumbnailUrl: json['thumbnailUrl'] as String,
    );
  }
}

4. 使用解析函数

使用你喜欢的 HTTP 客户端(如 httpdio)来获取 JSON 数据并进行解析。

使用 http

import 'package:http/http.dart' as http;

Future<List<Photo>> fetchPhotos(http.Client client) async {
  final response = await client.get(Uri.parse('https://jsonplaceholder.typicode.com/photos'));

  return GenericJsonParser.parseJsonListInBackground(
    response.body,
    Photo.fromJson,
  );
}

使用 dio

import 'package:dio/dio.dart';

Future<List<Photo>> fetchPhotos(Dio client) async {
  final response = await client.getUri(Uri.parse('https://jsonplaceholder.typicode.com/photos'));

  return GenericJsonParser.parseJsonListInBackground(
    response.data,
    Photo.fromJson,
    useDioPackage: true,
  );
}

完整示例

以下是完整的示例代码,展示了如何使用 generic_json_parser 插件解析 JSON 数据并在 Flutter 应用中显示照片列表。

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:generic_json_parser/generic_json_parser.dart';

// 定义 Photo 模型类
class Photo {
  final int albumId;
  final int id;
  final String title;
  final String url;
  final String thumbnailUrl;

  const Photo({
    required this.albumId,
    required this.id,
    required this.title,
    required this.url,
    required this.thumbnailUrl,
  });

  factory Photo.fromJson(Map<String, dynamic> json) {
    return Photo(
      albumId: json['albumId'] as int,
      id: json['id'] as int,
      title: json['title'] as String,
      url: json['url'] as String,
      thumbnailUrl: json['thumbnailUrl'] as String,
    );
  }
}

// 获取照片列表
Future<List<Photo>> fetchPhotos(http.Client client) async {
  final response = await client.get(Uri.parse('https://jsonplaceholder.typicode.com/photos'));

  return GenericJsonParser.parseJsonListInBackground(
    response.body,
    Photo.fromJson,
  );
}

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Photos'),
      ),
      body: FutureBuilder<List<Photo>>(
        future: fetchPhotos(http.Client()),
        builder: (context, snapshot) {
          if (snapshot.hasError) {
            return const Center(
              child: Text('An error has occurred!'),
            );
          } else if (snapshot.hasData) {
            return PhotoList(photos: snapshot.data!);
          } else {
            return const Center(
              child: CircularProgressIndicator(),
            );
          }
        },
      ),
    );
  }
}

class PhotoList extends StatelessWidget {
  const PhotoList({super.key, required this.photos});

  final List<Photo> photos;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return GridView.builder(
      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2,
      ),
      itemBuilder: (context, index) {
        return Image.network(photos[index].thumbnailUrl);
      },
    );
  }
}

更多关于Flutter JSON解析插件generic_json_parser的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON解析插件generic_json_parser的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 generic_json_parser 插件在 Flutter 中解析 JSON 的示例代码。这个插件允许你以一种类型安全的方式解析 JSON 数据,而无需手动编写大量的解析代码。

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

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

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

假设我们有一个简单的 JSON 数据结构如下:

{
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com"
}

我们希望将其解析为一个 Dart 对象。以下是具体步骤:

  1. 定义数据模型
import 'package:json_annotation/json_annotation.dart';

part 'user_model.g.dart';

@JsonSerializable()
class UserModel {
  final String name;
  final int age;
  final String email;

  UserModel({required this.name, required this.age, required this.email});

  // 从 JSON 生成 UserModel 实例的工厂构造函数
  factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);

  // 将 UserModel 实例转换为 JSON
  Map<String, dynamic> toJson() => _$UserModelToJson(this);
}

注意:json_annotation 包用于自动生成 fromJsontoJson 方法。你需要运行 flutter pub run build_runner build 来生成 user_model.g.dart 文件。

  1. 使用 generic_json_parser 解析 JSON

虽然有了 json_serializablegeneric_json_parser 可以进一步简化处理逻辑,尤其是当你有很多不同类型的 JSON 需要解析时。不过,generic_json_parser 并不直接生成 Dart 类,而是提供了一种更灵活的方式来解析 JSON。

假设你决定仍然使用 generic_json_parser 来解析上述 JSON(尽管在这个简单例子中可能看起来有些过度),你可以这样做:

import 'package:flutter/material.dart';
import 'package:generic_json_parser/generic_json_parser.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter JSON Parsing'),
        ),
        body: Center(
          child: FutureBuilder<Map<String, dynamic>>(
            future: _fetchData(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else {
                  final jsonData = snapshot.data!;
                  return _parseAndDisplayData(jsonData);
                }
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<Map<String, dynamic>> _fetchData() async {
    // 这里你应该从网络或本地资源获取 JSON 数据
    // 这里我们用一个硬编码的字符串作为示例
    String jsonString = '''
    {
      "name": "John Doe",
      "age": 30,
      "email": "john.doe@example.com"
    }
    ''';
    return jsonDecode(jsonString);
  }

  Widget _parseAndDisplayData(Map<String, dynamic> jsonData) {
    // 使用 generic_json_parser 解析 JSON
    final parser = JsonParser();
    final result = parser.parse(jsonData);

    // 假设我们知道结构,直接访问
    String name = result['name'] as String;
    int age = result['age'] as int;
    String email = result['email'] as String;

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Name: $name'),
        Text('Age: $age'),
        Text('Email: $email'),
      ],
    );
  }
}

在这个例子中,JsonParsergeneric_json_parser 包中的一个类,用于解析 JSON 数据。然而,需要注意的是,generic_json_parser 并没有提供类型安全的解析,它返回的是一个 Map<String, dynamic>,这意味着你仍然需要手动进行类型转换。

对于更复杂的 JSON 结构和类型安全需求,通常推荐使用 json_serializable 或其他类似工具来生成类型安全的 Dart 类。

回到顶部