Flutter JsonToDart 支持 JsonSchema

前言

JSON Schema 是一种用于描述和验证 JSON 文档结构的规范。它提供了一个强大的工具集,用于定义 JSON 数据的格式、类型和约束。

关键点:

  • 定义了用于描述 JSON 文档结构的语法。

  • 支持多种数据类型和约束,包括字符串、数字、布尔值、对象、数组等。

  • 提供了验证机制,确保 JSON 数据符合预定义的结构和规则。

在实际开发中,很多时候,我们没法方便地直接获取到接口的 Json ,但是后端文档里面一般都会提供 JSON Schema

JsonToDart

fluttercandies/json_to_dart_library: json_to_dart_library 该库已经支持解析 JSON Schema ,代码在后面。

Yapi API

YMFE/yapi: YApi 是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台

没有现成的,根据 api 实现了一套 dart 版本的

fluttercandies/yapi_api: A Dart package for interacting with YApi server APIs. Provides easy-to-use methods to fetch interface and project data from YApi with proper authentication and error handling.

快速上手

安装依赖

bash 复制代码
flutter pub add json_to_dart_library

如需配合 YApi 使用:

bash 复制代码
flutter pub add yapi_api

基本用法

通过 JSON Schema 生成 Dart Model

假设你有如下 JSON Schema

json 复制代码
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "User",
  "type": "object",
  "properties": {
    "id": { "type": "integer", "description": "用户ID" },
    "name": { "type": "string", "description": "用户名" },
    "email": { "type": "string", "description": "邮箱" }
  },
  "required": ["id", "name"]
}

你可以这样生成 Dart 代码:

dart 复制代码
import 'package:json_to_dart_library/json_to_dart_library.dart';

void main() async {
  DartObject? dartObject = await jsonToDartController.jsonToDartObject(
    json: '''{
  "\$schema": "http://json-schema.org/draft-07/schema#",
  "title": "User",
  "type": "object",
  "properties": {
    "id": { "type": "integer", "description": "用户ID" },
    "name": { "type": "string", "description": "用户名" },
    "email": { "type": "string", "description": "邮箱" }
  },
  "required": ["id", "name"]
}''',
  );

  var errors = jsonToDartController.getErrors();
  if (errors.isNotEmpty) {
    print('Errors found:');
    for (var error in errors) {
      print(error);
    }
    return;
  }

  if (dartObject != null) {
    var dartCode = jsonToDartController.generateDartCode(dartObject);
    File('output.dart').writeAsStringSync(dartCode!);
    print('Dart code generated successfully:');
  }  
}

结合 YApi 自动拉取接口 Schema 并生成 Dart Model

dart 复制代码
import 'package:yapi_api/yapi_api.dart';
import 'package:json_to_dart_library/json_to_dart_library.dart';

void main() async {
  YapiLoginResponse? loginResponse =
      await apiHelper.login(email: '', password: '');
  if (loginResponse != null && loginResponse.errcode == 0) {
    print('login success');
  } else {
    print('login failed : ${loginResponse?.errmsg}');
    return;
  }
  YapiInterfaceResponse? interfaceResponse = await apiHelper.getInterface(1);
  if (interfaceResponse != null) {
    print('interface : ${interfaceResponse.data?.title}');
  } else {
    print('get interface failed ');
  }
  YapiInterface? interfaceData = interfaceResponse?.data;
  if(interfaceData?.resBodyIsJsonSchema == true){
    final String? schema = interfaceData.resBody;
    final DartObject? result = await jsonToDartController.jsonToDartObject(schema);
     
  }
}

客户端使用

当然我们也提供了客户端

结语

最后感谢 龙哥/alex 帮忙弄的 action,现在打包 web 和桌面端都一步到位。 需要的自提 release.yml

Flutter,爱糖果,欢迎加入Flutter Candies,一起生产可爱的Flutter小糖果

最最后放上 Flutter Candies 全家桶,真香。

相关推荐
执明wa16 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder16 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农16 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户693717500138417 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr17 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight17 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
爱笑鱼17 小时前
Binder(四):ioctl(BINDER_WRITE_READ) 之后,事务怎样到达目标进程?
android
AFinalStone18 小时前
Android 7系统休眠唤醒(二)开机全链路—BootROM到Launcher
android·电源管理·休眠唤醒
Mr YiRan18 小时前
Android NDK开发之统计到未被回收的图片
android