fson 1.0.9 copy "fson: ^1.0.9" to clipboard
fson: ^1.0.9 copied to clipboard

Gernerating Dart model class from Json file.

fson Pub #

只用一行命令,直接将Json文件转为Dart model类。

安装 #

flutter pub global activate fson 或者 pub global activate fson

dev_dependencies:
  build_runner: any
  json_serializable: any

使用 #

  1. 在工程根目录下创建一个名为 "jsons" 的目录;
  2. 创建或拷贝Json文件到"jsons" 目录中 ;
  3. 运行 fson 命令生成Dart model类,生成的文件默认在"lib/models"目录下

特殊 Key #

"_"开头 #

以 _ 开头的 Key 将被 fson 过滤

@import #

在生成的Dart类中导入指定的文件

{
  "@import": "test/index.dart",
  "name": "fson"
}

// ------------------------------------------------------------

import 'package:json_annotation/json_annotation.dart';
import 'index.dart';
import 'test/index.dart';

part 'test.g.dart';

@JsonSerializable()
class Test {
  Test({
    this.name,
  });

  String name;

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

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

特殊 Value #

@data #

{
  "data": "@data",
  "name": "fson"
}

// ------------------------------------------------------------

import 'package:json_annotation/json_annotation.dart';
import 'index.dart';

part 'test.g.dart';

@JsonSerializable()
class Test<T> {
  Test({
    this.name,
    this.data,
  });

  String name;

  @ResultConverter()
  T? data;

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

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

@JsonSerializable()
class TestL<T> {
  TestL({
    this.name,
    this.data,
  });

  String name;

  @ResultConverter()
  List<T>? data;

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

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

"$" 开头 #

$ 为 tag 值 ,可修改。

{
  "age": "$int",
  "name": "fson"
}

// ------------------------------------------------------------

import 'package:json_annotation/json_annotation.dart';
import 'index.dart';

part 'test.g.dart';

@JsonSerializable()
class Test {
  Test({
    this.age,
    this.name,
  });

  int age;
  String name;

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

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

"$[]" 开头 #

$ 为 tag 值 ,可修改。( -t, --tag Specify the tag )

{
  "age": "$[]int",
  "name": "fson"
}

// ------------------------------------------------------------

import 'package:json_annotation/json_annotation.dart';
import 'index.dart';

part 'test.g.dart';

@JsonSerializable()
class Test {
  Test({
    this.age,
    this.name,
  });

  List<int> age;
  String name;

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

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

以 "@" 开头 #

您也可以使用json_annotation包中的“@JsonKey”标注特定的字段。

{
  "name": "@JsonKey() String"
}

// ------------------------------------------------------------

import 'package:json_annotation/json_annotation.dart';
import 'index.dart';

part 'test.g.dart';

@JsonSerializable()
class Test {
  Test({
    this.name,
  });

  @JsonKey()
  String name;

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

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

命令参数 #

默认的源json文件目录为根目录下名为 "json" 的目录;可以通过 src 参数自定义源json文件目录,可以通过dist 参数来自定义输出目录,例如:

fson src=json_files  dist=data  # 输出目录为 lib/data

help #

-s, --src     Specify the json directory.
              (defaults to "./jsons")
-d, --dist    Specify the dist directory.
              (defaults to "lib/models")
-t, --tag     Specify the tag
              (defaults to "$")
-h, --help    help