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 全家桶,真香。

相关推荐
手机不死我是天子2 分钟前
《Android 核心组件深度系列 · 第 2 篇 Service》
android
前行的小黑炭17 分钟前
Compose页面切换的几种方式:Navigation、NavigationBar+HorizontalPager,会导致LaunchedEffect执行?
android·kotlin·app
前行的小黑炭1 小时前
Android :Comnpose各种副作用的使用
android·kotlin·app
BD_Marathon14 小时前
【MySQL】函数
android·数据库·mysql
西西学代码15 小时前
安卓开发---耳机的按键设置的UI实例
android·ui
maki07719 小时前
虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
android·游戏引擎·vr·虚幻·pico·htc vive·大空间
千里马学框架20 小时前
音频焦点学习之AudioFocusRequest.Builder类剖析
android·面试·智能手机·车载系统·音视频·安卓framework开发·audio
大熊猫侯佩21 小时前
在肖申克监狱玩转 iOS 26:安迪的 Liquid Glass 复仇计划
ios·swiftui·swift
fundroid1 天前
掌握 Compose 性能优化三步法
android·android jetpack
TeleostNaCl1 天前
如何在 IDEA 中使用 Proguard 自动混淆 Gradle 编译的Java 项目
android·java·经验分享·kotlin·gradle·intellij-idea