Flutter JSON序列化插件belatuk_json_serializer的使用

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

Flutter JSON序列化插件 belatuk_json_serializer 的使用

简介

belatuk_json_serializer 是一个用于 Dart 的 JSON 序列化和反序列化的插件。它支持将对象转换为 JSON 字符串,以及将 JSON 字符串转换回对象实例。该插件完全支持空安全(Null Safety)。

Pub Version (including pre-releases) Null Safety Gitter License

注意:belatuk_json_serializer 是对 package:json_god 的替代,并引入了一些破坏性的更改以支持 NNBD(非空类型)。

安装

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

dependencies:
  belatuk_json_serializer: ^7.1.0

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

使用

建议在导入库时使用别名,例如 jsonSerializer

import 'package:belatuk_json_serializer/belatuk_json_serializer.dart' as jsonSerializer;

序列化 JSON

调用 jsonSerializer.serialize(x) 方法可以将对象同步转换为 JSON 字符串。

示例:将 Map 对象转换为 JSON 字符串

void main() {
  Map map = {"foo": "bar", "numbers": [1, 2, {"three": 4}]};

  // 输出: {"foo":"bar","numbers":[1,2,{"three":4}]}
  String json = jsonSerializer.serialize(map);
  print(json);
}

示例:将自定义类转换为 JSON 字符串

class A {
  String foo;
  A(this.foo);
}

class B {
  String hello;
  late A nested;

  B(String hello, String foo) {
    this.hello = hello;
    this.nested = A(foo);
  }
}

void main() {
  String json = jsonSerializer.serialize(B("world", "bar"));
  print(json); // 输出: {"hello":"world","nested":{"foo":"bar"}}
}

如果类中有 toJson 方法,则会调用该方法进行序列化。

反序列化 JSON

反序列化同样简单,通过 jsonSerializer.deserialize 方法实现。

示例:将 JSON 字符串转换为 Map

void main() {
  Map map = jsonSerializer.deserialize('{"hello":"world"}');
  print(map); // 输出: {hello: world}

  int three = jsonSerializer.deserialize("3");
  print(three); // 输出: 3
}

将 JSON 转换为类实例

你可以将 JSON 字符串反序列化为任何类型的实例。只需将类型作为第二个参数传递给 jsonSerializer.deserialize 方法。

如果类有 fromJson 构造函数,则会调用该构造函数。

class Child {
  String foo;
  Child({required this.foo});
}

class Parent {
  String hello;
  late Child child;

  Parent({required this.hello, required String foo}) {
    child = Child(foo: foo);
  }

  factory Parent.fromJson(Map<String, dynamic> json) {
    return Parent(
      hello: json['hello'],
      foo: json['child']['foo'],
    );
  }
}

void main() {
  Parent parent = jsonSerializer.deserialize('{"hello":"world","child":{"foo":"bar"}}', Parent);
  print(parent.hello); // 输出: world
  print(parent.child.foo); // 输出: bar
}

注意:任何可 JSON 反序列化的类必须能够在不传入参数的情况下初始化。如果 Foo() 会抛出错误,则不能使用 Foo 类与 JSON 进行交互。

验证示例

下面是一个简单的验证示例,展示如何处理无效输入:

class HasAnInt {
  int theInt;
  HasAnInt(this.theInt);
}

void main() {
  try {
    HasAnInt invalid = jsonSerializer.deserialize('["some invalid input"]', HasAnInt);
  } catch (e) {
    print(e); // 输出: 错误信息
  }
}

完整示例 Demo

下面是一个完整的示例,展示了如何使用 belatuk_json_serializer 插件来序列化和反序列化自定义类。

import 'package:belatuk_json_serializer/belatuk_json_serializer.dart' as jsonSerializer;

class A {
  String foo;
  A(this.foo);

  [@override](/user/override)
  String toString() => 'A(foo: $foo)';
}

class B {
  String hello;
  late A nested;

  B(this.hello, String foo) {
    nested = A(foo);
  }

  [@override](/user/override)
  String toString() => 'B(hello: $hello, nested: $nested)';
}

void main() {
  // 序列化
  B bInstance = B("world", "bar");
  String jsonString = jsonSerializer.serialize(bInstance);
  print(jsonString); // 输出: {"hello":"world","nested":{"foo":"bar"}}

  // 反序列化
  B deserializedB = jsonSerializer.deserialize(jsonString, B);
  print(deserializedB); // 输出: B(hello: world, nested: A(foo: bar))
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用belatuk_json_serializer插件来进行JSON序列化和反序列化的示例代码。

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

dependencies:
  flutter:
    sdk: flutter
  belatuk_json_serializer: ^最新版本号  # 请替换为实际的最新版本号

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

1. 定义数据模型

假设我们有一个简单的用户数据模型User

import 'package:belatuk_json_serializer/belatuk_json_serializer.dart';

part 'user.g.dart';

@Serializable()
class User {
  String? name;
  int? age;
  String? email;

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

  // 工厂方法用于从JSON反序列化
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 方法用于将对象序列化为JSON
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意,我们使用了@Serializable()注解,并且引入了part 'user.g.dart';。这个part文件将在后面自动生成。

2. 生成序列化代码

为了生成序列化代码,你需要在项目根目录下创建一个构建脚本,例如build.sh(对于macOS/Linux)或build.bat(对于Windows),并添加以下内容:

build.sh:

#!/bin/bash
dart run belatuk_json_serializer:generate .

build.bat:

@echo off
dart run belatuk_json_serializer:generate .

然后,运行这个脚本。它会在你的项目目录中生成user.g.dart文件,这个文件包含了序列化和反序列化的具体实现。

3. 使用序列化功能

现在,你可以在你的Flutter应用中使用User类的序列化和反序列化功能了:

import 'package:flutter/material.dart';
import 'user.dart';  // 引入生成的代码和数据模型

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Belatuk JSON Serializer Demo'),
        ),
        body: Center(
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 创建一个User对象
    User user = User(name: 'John Doe', age: 30, email: 'john.doe@example.com');

    // 将对象序列化为JSON
    Map<String, dynamic> userJson = user.toJson();
    print('Serialized JSON: $userJson');

    // 从JSON反序列化为对象
    User deserializedUser = User.fromJson(userJson);
    print('Deserialized User: ${deserializedUser.name}, ${deserializedUser.age}, ${deserializedUser.email}');

    return Text('Check the console for serialized and deserialized output.');
  }
}

总结

通过上述步骤,你已经成功地在Flutter项目中使用了belatuk_json_serializer插件来进行JSON的序列化和反序列化。注意,这个插件依赖于代码生成,所以需要在开发过程中添加构建脚本并运行它来生成必要的代码文件。

回到顶部