Flutter JSON处理插件jsonut的使用

Flutter JSON处理插件jsonut的使用

jsonut 是一个用于以类型安全的方式处理JSON数据的轻量级工具包。以下是该插件的详细说明和使用方法。

特性

  • 类型安全:JSON解析和序列化是类型安全且易于使用的。
  • 轻量级:无需依赖、代码生成或反射。
  • 灵活:可以按需进行惰性解析或严格验证。
  • 简洁:只使用你需要的部分。

开始使用

首先,在你的 pubspec.yaml 文件中添加 jsonut 包:

dependencies:
  jsonut: ^0.4.0

或者使用命令行安装:

dart pub add jsonut

你也可以直接将单个 .dart 文件复制到你的项目中:

curl -o lib/jsonut.dart https://raw.githubusercontent.com/matanlurey/jsonut/main/lib/jsonut.dart

基本用法

以下是一个基本示例,展示了如何使用 jsonut 解析和访问JSON数据。

import 'package:jsonut/jsonut.dart';

void main() {
  const json = '''
  {
    "name": "John Doe",
    "age": 42,
    "student": false,
    "dogs": [
      "Fido",
      "Rex"
    ]
  }
  ''';

  final object = JsonObject.parse(json);

  print(object['name'].string()); // John Doe
  print(object['age'].number()); // 42
  print(object['student'].boolean()); // false

  // 示例:访问不存在的字段
  print(object['email'].stringOrNull()); // null

  // 示例:处理数组
  final dogs = object['dogs'].array().mapUnmodifiable((e) => e.string());

  // 我们现在得到一个真实的 List<String>
  print(dogs is List<String>);
}

性能基准测试

jsonut 包含一个基准测试文件,位于 benchmark/ 目录下。你可以通过以下命令运行它:

# JIT 模式
dart run benchmark/decode.dart

# AOT 模式
dart compile exe benchmark/decode.dart
./benchmark/decode.exe

在作者的机器(M2 MacBook Pro)上,jsonut 的解码性能与直接使用 object['...'] as ... 模式或动态调用相比,有不到10%的额外开销。在AOT模式下,jsonut 比动态调用快,但解码速度慢约3%。

贡献指南

如果你希望为这个包做出贡献,请遵循以下指南:

  • 问题:对于任何非琐碎的更改,请先打开一个issue。
  • 拉取请求:请针对 main 分支提交PR。
  • 测试:为任何新功能或行为变更添加测试。
  • 依赖:避免添加新的依赖(开发依赖除外)。

要本地检查代码覆盖率,请运行以下命令:

# 生成覆盖率报告
dart run coverage:test_with_coverage -- -P coverage

# 如果你安装了 `genhtml`,可以打开覆盖率报告
genhtml coverage/lcov.info -o coverage/html && open coverage/html/index.html

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

1 回复

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


在处理Flutter中的JSON数据时,json_serializable是一个非常流行的插件,它自动生成从JSON到Dart对象的代码。不过,看起来你在询问一个名为jsonut的插件。需要注意的是,jsonut并不是Flutter社区广泛认知的标准或知名插件。不过,假设jsonut是一个假想的或者特定环境下的插件,并且它具有类似json_serializable的功能,下面是一个如何处理JSON数据的示例代码结构。

由于jsonut的具体实现细节未知,我将提供一个使用json_serializable的示例,这是处理JSON数据的标准做法。如果你确实在使用jsonut,你可以根据这个示例的结构调整代码以适应jsonut的API。

使用 json_serializable 的示例

首先,确保你的pubspec.yaml文件中包含json_serializable依赖:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.0.1  # 确保版本号是最新的

dev_dependencies:
  build_runner: ^2.0.4  # 用于生成代码
  json_serializable: ^6.0.1  # 确保版本号是最新的

然后,创建一个数据模型。例如,假设我们有一个用户信息的JSON数据:

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

对应的Dart模型可能看起来像这样:

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';  // 这将是由json_serializable生成的代码文件

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

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

  // 从JSON创建User对象的工厂构造函数
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 将User对象转换为JSON
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

运行以下命令生成user.g.dart文件:

flutter pub run build_runner build

现在,你可以使用这个模型来解析和生成JSON数据:

void main() {
  // 示例JSON数据
  String jsonString = '''
  {
    "name": "John Doe",
    "email": "john.doe@example.com",
    "age": 30
  }
  ''';

  // 解析JSON字符串到User对象
  User user = User.fromJson(jsonDecode(jsonString));

  // 输出User对象的信息
  print('Name: ${user.name}');
  print('Email: ${user.email}');
  print('Age: ${user.age}');

  // 将User对象转换回JSON字符串
  String json = jsonEncode(user.toJson());
  print('JSON: $json');
}

假设使用 jsonut 的情况

如果jsonut有类似的API,你可能只需要调整导入语句和生成代码的命令。例如,如果jsonut有一个类似的注解处理器,你的代码可能看起来像这样:

// 假设jsonut提供了类似的注解和生成代码的功能
import 'package:jsonut/jsonut.dart';  // 假设的包路径

part 'user.jsonut.dart';  // 假设生成的文件扩展名不同

@JsonUtSerializable()  // 假设的注解名称不同
class User {
  final String name;
  final String email;
  final int age;

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

  // 假设jsonut生成的工厂构造函数和toJson方法有不同的命名或结构
  factory User.fromJsonUt(Map<String, dynamic> json) => _$UserFromJsonUt(json);

  Map<String, dynamic> toJsonUt() => _$UserToJsonUt(this);
}

然后,你可能需要使用一个不同的命令来生成代码,例如:

flutter pub run jsonut_builder build  // 假设的命令和包名

请注意,上述关于jsonut的部分是基于假设的,因为jsonut并不是一个广为人知的Flutter插件。如果你确实在使用jsonut,请参考其官方文档以获取准确的用法和API。

回到顶部