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

相关推荐
平头哥技术团队3 小时前
Day 10 | 工欲善其事:VS Code 配置与项目归档
android·开发语言·前端·javascript·html·交互
冬木家居4 小时前
40㎡客厅变形记,小家住出大自由[特殊字符]
android·经验分享·笔记·智能家居·微信公众平台
AFinalStone4 小时前
Android 7系统无障碍服务(六)输入事件拦截与 TouchExplorer
android·无障碍服务
天空之城--5 小时前
MT管理器Android逆向工程完全指南:从入门到实战
android
Anhty6 小时前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
渡我白衣7 小时前
并查集:基础认识与模拟实现
android·java·javascript·数据结构·c++·算法·并查集
Android-Flutter9 小时前
flutter GetX 详解
android·flutter
MyFreeIT11 小时前
Android Manual
android
hai_android11 小时前
AIDL 实现 IPC 进程间通信
android·android studio
AFinalStone13 小时前
Android 7系统无障碍服务(五)AccessibilityNodeInfo 的构建与查询
android·无障碍服务