Flutter JSON数据模型自动生成插件json_inference的使用

Flutter JSON数据模型自动生成插件json_inference的使用

json_inference

一个Dart包,用于推断JSON数据类型。

json_inference 可以分析多个JSON样本,并推断它们的定义格式。

示例

输入

Sample 1

{
  "value1": 1,
  "value2": 2.0,
  "value3": "3",
  "value4": true
}

Sample 2

{
  "value1": 4,
  "value2": 5,
  "value3": 6
}

输出(以JSON形式)

{
  "type": "JSON 对象",
  "optional": false,
  "fields": {
    "value1": {
      "type": "整数",
      "optional": false
    },
    "value2": {
      "type": "数字",
      "optional": false
    },
    "value3": {
      "type": "对象",
      "optional": false
    },
    "value4": {
      "type": "布尔值",
      "optional": true
    }
  }
}

使用方法

import 'package:json_inference/json_inference.dart';

void main() {
  const a = {
    'value1': 1,
    'value2': 2.0,
    'value3': '3',
    'value4': true,
  };

  const b = {
    'value1': 4,
    'value2': 5,
    'value3': 6,
  };

  // 生成描述每个样本的 [ValueType]
  final aValueType = inferValueType(a);
  final bValueType = inferValueType(b);

  // 组合 [ValueType],选择适用于所有样本中每个字段的最具体描述
  var combinedValueType = generalizeValueTypes([aValueType, bValueType]);

  // 或者一次性完成上述所有步骤
  combinedValueType = inferValueTypes([a, b]);

  // 当更多的样本可用时,[ValueType] 推断可以得到改进
  const c = {
    'value1': 7,
    'value2': 8.0,
    'value3': '9',
    'value4': false,
  };

  combinedValueType = generalizeValueTypes([
    combinedValueType,
    inferValueType(c),
  ]);

  // 打印结果
  print(const JsonEncoder.withIndent('  ').convert(a));
  print(const JsonEncoder.withIndent('  ').convert(b));
  print(const JsonEncoder.withIndent('  ').convert(combinedValueType));
}

完整示例

以下是完整的示例代码:

// ignore_for_file: avoid_print

import 'dart:convert';

import 'package:json_inference/json_inference.dart';

void main() {
  const a = {
    'value1': 1,
    'value2': 2.0,
    'value3': '3',
    'value4': true,
  };

  const b = {
    'value1': 4,
    'value2': 5,
    'value3': 6,
  };

  // 推断 JSON 样本的 ValueType
  final valueType = inferValueTypes([a, b]);

  // 打印结果
  print(const JsonEncoder.withIndent('  ').convert(a));
  print(const JsonEncoder.withIndent('  ').convert(b));
  print(const JsonEncoder.withIndent('  ').convert(valueType));
}

更多关于Flutter JSON数据模型自动生成插件json_inference的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON数据模型自动生成插件json_inference的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


json_inference 是一个用于 Flutter 的 JSON 数据模型自动生成插件,它可以根据 JSON 数据自动生成 Dart 数据模型类。这对于处理 API 响应数据、配置文件等 JSON 数据非常有用,可以节省手动编写数据模型类的时间。

安装 json_inference

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

dependencies:
  flutter:
    sdk: flutter
  json_inference: ^0.0.1  # 请确保使用最新版本

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

使用 json_inference

json_inference 插件提供了一个命令行工具,可以通过 JSON 数据自动生成 Dart 数据模型类。

1. 创建 JSON 文件

假设你有一个 JSON 文件 example.json,内容如下:

{
  "name": "John Doe",
  "age": 30,
  "isMarried": false,
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "zipCode": "10001"
  },
  "hobbies": ["reading", "traveling", "coding"]
}

2. 生成 Dart 数据模型类

在终端中运行以下命令,使用 json_inference 生成 Dart 数据模型类:

flutter pub run json_inference example.json -o lib/models/

这将会在 lib/models/ 目录下生成一个 Dart 文件,文件名基于 JSON 文件的名称,例如 example.dart,内容如下:

import 'package:json_annotation/json_annotation.dart';

part 'example.g.dart';

@JsonSerializable()
class Example {
  String name;
  int age;
  bool isMarried;
  Address address;
  List<String> hobbies;

  Example({
    required this.name,
    required this.age,
    required this.isMarried,
    required this.address,
    required this.hobbies,
  });

  factory Example.fromJson(Map<String, dynamic> json) =>
      _$ExampleFromJson(json);

  Map<String, dynamic> toJson() => _$ExampleToJson(this);
}

@JsonSerializable()
class Address {
  String street;
  String city;
  String zipCode;

  Address({
    required this.street,
    required this.city,
    required this.zipCode,
  });

  factory Address.fromJson(Map<String, dynamic> json) =>
      _$AddressFromJson(json);

  Map<String, dynamic> toJson() => _$AddressToJson(this);
}

3. 生成 .g.dart 文件

生成的 Dart 文件使用了 json_serializable 库,你需要运行以下命令来生成对应的 .g.dart 文件:

flutter pub run build_runner build

这将会生成 example.g.dart 文件,其中包含 fromJsontoJson 方法的实现。

4. 使用生成的数据模型

现在你可以在你的 Flutter 项目中使用生成的数据模型类来解析 JSON 数据:

import 'package:flutter/material.dart';
import 'models/example.dart';

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final jsonData = {
      "name": "John Doe",
      "age": 30,
      "isMarried": false,
      "address": {
        "street": "123 Main St",
        "city": "New York",
        "zipCode": "10001"
      },
      "hobbies": ["reading", "traveling", "coding"]
    };

    final example = Example.fromJson(jsonData);

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('JSON Inference Example'),
        ),
        body: Center(
          child: Text('Name: ${example.name}'),
        ),
      ),
    );
  }
}

void main() => runApp(MyApp());
回到顶部