Flutter数据转换插件transformer_simplified的使用

Flutter数据转换插件transformer_simplified的使用

Transformer Simplified 是一个简单的库,用于在 JSON 结构之间进行映射和转换。考虑到 JSON 结构是一个 Map<String, dynamic> 类型,此库可以用来转换任何这种类型的映射。

示例代码

以下是一个完整的示例,展示了如何使用 TransformerSimplified 进行数据转换。

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart'; // 引入路径提供者
import 'package:transformer_simplified/transformer_simplified.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Transformer Simplified Example")),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              dynamic jsonData = json.decode(await File('./example/mapping.json').readAsString());
              TransformerRegistry.get().setCustom('revert', Revert());

              TransformerSimplified.get().load('mapping', jsonData);

              String key1LowerCase = 'david lower case';
              String streetUpperCase = 'STREET IN UPPERCASE';
              String zipCodeAsString = '10000';
              String otherZipCode = 'other cedex in lowercase';
              Map<String, dynamic> input = {
                'key1': key1LowerCase,
                'key2': [
                  {
                    'street': streetUpperCase,
                    'zipcode': zipCodeAsString,
                    'city': 'myCity',
                    'alias': {'otherZipCode': 'cedex in lowercase'}
                  },
                  {
                    'street': 'STREET2 IN UPPERCASE2',
                    'zipcode': '30000',
                    'city': 'yourCity',
                    'alias': {'otherZipCode': otherZipCode}
                  }
                ],
              };

              dynamic output = TransformerSimplified.get()
                  .execute(input, 'formUserToJSonUser', 'mapping');

              print(output);
            },
            child: Text("执行转换"),
          ),
        ),
      ),
    );
  }
}

JSON 映射配置

以下是用于映射和转换的 JSON 配置文件示例:

[
  {
    "id": "formUserToJSonUser",
    "mappings": [
      {
        "type": "single",
        "input": {
          "path": "key1"
        },
        "output": {
          "path": "name1"
        },
        "transformer": "builtin://toUppercase"
      },
      {
        "type": "complex",
        "list": true,
        "input": {
          "path": "key2"
        },
        "output": {
          "path": "addresses",
          "comment": "列表类型要么是从第一个根类型中推断出来的类型,要么是 Map<String, dynamic> 如果输出是 map/list 且没有预定义的类型"
        },
        "transformer": "mapping://map2Address"
      }
    ]
  },
  {
    "id": "map2Address",
    "mappings": [
      {
        "type": "single",
        "input": {
          "path": "street"
        },
        "output": {
          "path": "street"
        },
        "transformer": "builtin://toLowercase"
      },
      {
        "type": "single",
        "input": {
          "path": "zipcode"
        },
        "output": {
          "path": "ZipCode"
        },
        "transformer": "builtin://toInteger"
      },
      {
        "type": "single",
        "input": {
          "path": "city"
        },
        "output": {
          "path": "city"
        }
      },
      {
        "type": "complex",
        "input": {
          "path": "alias"
        },
        "output": {
          "path": "alias"
        },
        "transformer": "mapping://mappingAlias"
      }
    ]
  },
  {
    "id": "mappingAlias",
    "mappings": [
      {
        "type": "single",
        "input": {
          "path": "otherZipCode"
        },
        "output": {
          "path": "newZipCode"
        },
        "transformer": "custom://revert"
      }
    ]
  }
]

Dart 代码解释

  1. 导入必要的包

    import 'dart:convert';
    import 'package:flutter/material.dart';
    import 'package:path_provider/path_provider.dart';
    import 'package:transformer_simplified/transformer_simplified.dart';
    
  2. 读取 JSON 文件并解析

    dynamic jsonData = json.decode(await File('./example/mapping.json').readAsString());
    
  3. 注册自定义转换器

    TransformerRegistry.get().setCustom('revert', Revert());
    
  4. 加载映射配置

    TransformerSimplified.get().load('mapping', jsonData);
    
  5. 准备输入数据

    Map<String, dynamic> input = {
      'key1': key1LowerCase,
      'key2': [
        {
          'street': streetUpperCase,
          'zipcode': zipCodeAsString,
          'city': 'myCity',
          'alias': {'otherZipCode': 'cedex in lowercase'}
        },
        {
          'street': 'STREET2 IN UPPERCASE2',
          'zipcode': '30000',
          'city': 'yourCity',
          'alias': {'otherZipCode': otherZipCode}
        }
      ],
    };
    
  6. 执行转换

    dynamic output = TransformerSimplified.get()
        .execute(input, 'formUserToJSonUser', 'mapping');
    

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

1 回复

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


transformer_simplified 是一个用于简化 Flutter 中数据转换的插件。它可以帮助你更容易地将一种数据类型转换为另一种数据类型,特别是在处理复杂的嵌套数据结构时。

安装

首先,你需要在 pubspec.yaml 文件中添加 transformer_simplified 依赖:

dependencies:
  flutter:
    sdk: flutter
  transformer_simplified: ^1.0.0  # 请检查最新版本

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

基本用法

transformer_simplified 提供了一个 Transformer 类,你可以通过继承它来创建自定义的转换器。以下是一个简单的例子,展示如何将 JSON 数据转换为自定义 Dart 对象。

1. 定义数据模型

假设你有一个 User 类:

class User {
  final String name;
  final int age;

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

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      name: json['name'],
      age: json['age'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
    };
  }
}

2. 创建转换器

你可以创建一个 UserTransformer 类来处理 User 对象的转换:

import 'package:transformer_simplified/transformer_simplified.dart';

class UserTransformer extends Transformer<User> {
  [@override](/user/override)
  User fromJson(Map<String, dynamic> json) {
    return User.fromJson(json);
  }

  [@override](/user/override)
  Map<String, dynamic> toJson(User user) {
    return user.toJson();
  }
}

3. 使用转换器

现在你可以使用 UserTransformer 来转换数据:

void main() {
  final transformer = UserTransformer();

  final json = {'name': 'John Doe', 'age': 30};
  final user = transformer.fromJson(json);

  print('User: ${user.name}, ${user.age}');

  final jsonOutput = transformer.toJson(user);
  print('JSON: $jsonOutput');
}

处理嵌套数据结构

transformer_simplified 也可以处理嵌套的数据结构。例如,如果你有一个包含 User 对象的 Order 类:

class Order {
  final String id;
  final User user;

  Order({required this.id, required this.user});

  factory Order.fromJson(Map<String, dynamic> json) {
    return Order(
      id: json['id'],
      user: User.fromJson(json['user']),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'user': user.toJson(),
    };
  }
}

你可以创建一个 OrderTransformer

class OrderTransformer extends Transformer<Order> {
  final UserTransformer userTransformer = UserTransformer();

  [@override](/user/override)
  Order fromJson(Map<String, dynamic> json) {
    return Order(
      id: json['id'],
      user: userTransformer.fromJson(json['user']),
    );
  }

  [@override](/user/override)
  Map<String, dynamic> toJson(Order order) {
    return {
      'id': order.id,
      'user': userTransformer.toJson(order.user),
    };
  }
}
回到顶部