[flutter]一键将YAPI生成的api.json文件转为需要的Dart Model类的脚本

目的:

根据YAPI接口平台生成的api.json接口文件,将接口数据转化为model类,生成对应的接口值类型文件。

发现:

api.json文件导出:

YAPi是一个接口管理平台,登录账号打开项目后,在点击数据管理菜单,右侧导出按钮可以将接口数据全部导出在一份api.json文件中。

16ba829511d2451bb9f24e7dba9a3453.png

api.json文件分析:

4a1c7f4b964142ac89a00e69d17bb3f2.png

res_body与res_body_other的json解码后格式示例 :

b21fa289982d4841955bf365eae7edd0.png

dart文件模板

生成结果 

脚本源码: 

import 'dart:convert';
import 'dart:io';const SRC = "json_model/api.json"; //来源JSON 文件
const DIST = "lib/models/"; //输出model目录
const TEMPLATE = "json_model/template.txt"; //dart文件模板void run() {var list = json.decode(File(SRC).readAsStringSync());for (var apiClass in (list as List)) {apiClass["list"].forEach((api) {if (api["res_body"] != null) {var map = jsonDecode(api["res_body"]);processData(map, api["path"], "response");}if(api["method"]=="GET"){if (api["req_query"].length!=0) {processGetData(api["req_query"],api["path"]);}}else{if (api["req_body_other"] != null) {var map = jsonDecode(api["req_body_other"]);processData(map, api["path"], "query");}}});}debug("文件生成结束");
}String processData(Map<String, dynamic> map, String path, String form, [String? keyName]) {var template = File(TEMPLATE).readAsStringSync(); /* dart文件模板 */var tempPath = path.split('/');tempPath.removeAt(0);var filename = tempPath.join("_");if (map['type'] == 'array') {var type = processData(map["items"], path, form, keyName);if (type.startsWith('%')) {/* 数组内容为对象 */var className = type.substring(1); /* Person */return '%[]$className';} else {return 'List<$type>';}} else if (map["type"] == 'object') {var setImport = <String>[];StringBuffer setKey = StringBuffer();(map["properties"] as Map<String, dynamic>).forEach((key, v) {/* 注释 */setKey.write("///");setKey.writeln((v["description"] as String).replaceAll("\n", " "));setKey.write("  ");bool ifRequired = map["required"] != null && (map["required"] as List).contains(key);if (ifRequired) {setKey.write("late ");}if (v["type"] == 'array') {var vType = processData(v, path, form, key);if (vType.startsWith('%[]')) {vType = vType.substring(3); /* Peason */var fileName = changeFirstChar(vType, false);setImport.add('import "$fileName.dart"');setKey.write('List<$vType>');} else {setKey.write(vType);}} else if (v["type"] == 'object') {var type = processData(v, path, form, key);var className = type.substring(1);var filename = changeFirstChar(className, false);setImport.add('import "$filename.dart"');setKey.write(className);} else {setKey.write(getType(v["type"]));}if (!ifRequired) {setKey.write("?");}setKey.write(" ");setKey.write(key);setKey.writeln(";"); /* writeln换行 */setKey.write("  ");});if (keyName != null) {filename += "_$keyName";}filename += "_$form";var tempImport = setImport.join(";\r\n");tempImport += tempImport.isEmpty ? "" : ";";String className = filename[0].toUpperCase() + filename.substring(1);var dist = template.replaceAll("%name", filename);dist = dist.replaceAll("%Name", className);dist = dist.replaceFirst("%i", tempImport);dist = dist.replaceFirst("%key", setKey.toString());var newFile = File("$DIST$filename.dart");if (!newFile.existsSync()) {newFile.createSync();}newFile.writeAsStringSync(dist);return '%$className'; /* %Person */}return getType(map["type"]);
}String getType(String type) {// current = current.toLowerCase();switch (type) {case 'boolean':return "bool";case 'integer':return "num";case 'number':return "num";case 'string':return "String";default:return type;}
}processGetData(List list, String path){var template = File(TEMPLATE).readAsStringSync(); /* dart文件模板 */var tempPath = path.split('/');tempPath.removeAt(0);var filename = tempPath.join("_");filename+="_query";StringBuffer setKey = StringBuffer();for (var element in list) { setKey.write("///");setKey.writeln((element["desc"] as String).replaceAll("\n", " "));setKey.write("  ");if (element["required"]=="1") {setKey.write("late ");}setKey.write("String");if (element["required"]=="0") {setKey.write("?");}setKey.write(" ");setKey.write(element["name"]);setKey.writeln(";"); /* writeln换行 */setKey.write("  ");}String className = filename[0].toUpperCase() + filename.substring(1);var dist = template.replaceAll("%name", filename);dist = dist.replaceAll("%Name", className);dist = dist.replaceFirst("%i", "");dist = dist.replaceFirst("%key", setKey.toString());var newFile = File("$DIST$filename.dart");if (!newFile.existsSync()) {newFile.createSync();}newFile.writeAsStringSync(dist);
}String changeFirstChar(String str, [bool upper = true]) {return (upper ? str[0].toUpperCase() : str[0].toLowerCase()) + str.substring(1);
}/// 打印
void debug(String str) {DateTime now = DateTime.now();var value = now.toString();value += ": $str\n";File("json_model/debugLog.txt").writeAsBytesSync(const Utf8Encoder().convert(value), mode: FileMode.writeOnlyAppend);
}void main() {run();
}

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vuex3学习笔记

文章目录 1&#xff0c;入门案例辅助函数 2&#xff0c;mutations传参辅助函数 3&#xff0c;actions辅助函数 4&#xff0c;getters辅助函数 5&#xff0c;模块拆分6&#xff0c;访问子模块的state辅助函数 7&#xff0c;访问子模块的getters辅助函数 8&#xff0c;访问子模块…

Python魔法之旅-魔法方法(23)

目录 一、概述 1、定义 2、作用 二、应用场景 1、构造和析构 2、操作符重载 3、字符串和表示 4、容器管理 5、可调用对象 6、上下文管理 7、属性访问和描述符 8、迭代器和生成器 9、数值类型 10、复制和序列化 11、自定义元类行为 12、自定义类行为 13、类型检…

【Python】数据处理:OS目录文件操作

Python的os模块是一个用于与操作系统进行交互的标准库模块。它提供了丰富的功能来处理文件和目录、执行系统命令、获取和设置环境变量等。 工作目录操作 获取当前工作目录 os.getcwd()参数&#xff1a;无返回值&#xff1a;一个字符串&#xff0c;表示当前工作目录的路径。这…

什么,一不小心打造了一个基于大模型的操作系统

如果以大模型为Kernel, 形成一个新的操作系统&#xff0c;那么&#xff1a; 1. byzer-llm 是这个大模型操作系统的编程接口&#xff0c;有点类似Linux操作系统的C ABI。 2. byzer-retrieval 也被集成进 byzer- llm 接口里&#xff0c;算是大模型操作系统的文件系统&#xff0c…

pytorch 自定义学习率更新 Poly

Poly 学习率调整策略需要继承_LRScheduler类&#xff0c;该类包含三个重要属性和两个重要方法 学习率与batch-size的关系 一般来说&#xff0c;batch-size的大小一般与学习率的大小成正比。batch-size越大一般意味着算法收敛方向的置信度越大&#xff0c;也可以选择较大的学…

STM32快速入门(ADC数模转换)

STM32快速入门&#xff08;ADC数模转换&#xff09; 前言 ADC数模转换存在的意义就是将一些温度传感器、各自数据传感器产生的模拟信号转换成方便识别和计算的数字信号。 导航 图24 通用定时器框图&#xff1a; 图片截取自STM32 F1XX中文参考手册。还是以框图为中心&#x…

FinalShell导出服务器配置信息密码password是加密的,如何解密?

本章教程,主要实现了一个小的功能,对FinalShell导出的配置信息,进行解密。 FinalShell导出之后,会产生一个json文件,例如下面这种json格式,里面记录了服务器的IP地址,端口和密码,里面的密码是经过加密处理的,本文主要利用java代码实现对这个password进行解密还原。 {&…

(论文翻译)Coordinate Attention for Efficient Mobile Network Design(坐标注意力 CVPR2021)

Coordinate Attention for Efficient Mobile Network Design&#xff08;CVPR2021&#xff09; 文章目录 Coordinate Attention for Efficient Mobile Network Design&#xff08;CVPR2021&#xff09;摘要1.引言2.相关工作3.方法&#xff1a;Coordinate Attention3.1.Revisit …

【c++】哈希>unordered容器哈希表哈希桶哈希的应用详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1. unordered系列关联式容器 1.1 unordered_map 1.1.1 unordered_map的文档介绍 1.1.2 unordered_map的接口说明 1.1.2.1 unordered_m…

Java学习 - Maven - 常用命令(学习精选)

前言 在上一篇文章中&#xff0c;我们对 Maven 有了初步的了解&#xff0c;包括它的定义、安装步骤以及一些基本的配置方法。Maven 是一个强大的项目管理工具&#xff0c;它可以帮助开发者自动化构建过程&#xff0c;并且管理项目的依赖关系。 今天&#xff0c;我们将深入探讨…

上位机图像处理和嵌入式模块部署(f407 mcu和其他mcu品类的选择)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多朋友读书的时候学的是stm32&#xff0c;工作中用的也是stm32。这本来问题不大&#xff0c;但是过去两三年的经历告诉我们&#xff0c;mcu的使用…

【设计模式】行为型设计模式之 职责链模式,探究过滤器、拦截器、Mybatis插件的底层原理

一、介绍 职责链模式在开发场景中经常被用到&#xff0c;例如框架的过滤器、拦截器、还有 Netty 的编解码器等都是典型的职责链模式的应用。 标准定义 GOF 定义&#xff1a;将请求的发送和接收解耦&#xff0c;让多个接收对象都有机会处理这个请求&#xff0c;将这些接收对象…

k8s小型实验模拟

&#xff08;1&#xff09;Kubernetes 区域可采用 Kubeadm 方式进行安装。&#xff08;5分&#xff09; &#xff08;2&#xff09;要求在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建2个Nginx Pod分别放置在两个不同的节点上&#xff0c;Pod使用hostPat…

Java | Leetcode Java题解之第139题单词拆分

题目&#xff1a; 题解&#xff1a; public class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet new HashSet(wordDict);boolean[] dp new boolean[s.length() 1];dp[0] true;for (int i 1; i < s.len…

JimuReport 积木报表 v1.7.52 版本发布,免费的低代码报表

项目介绍 一款免费的数据可视化报表工具&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完…

智能变电站网络报文记录及故障录波分析装置

是基于Intel X86、PowerPC、FPGA等技术的高度集成化的硬件平台&#xff0c;采用了高性能CPU无风扇散热、网络数据采集、高速数据压缩存储加密等多种技术&#xff0c;实现了高性能计算、多端口同步高速数据采集、数据实时分析、大容量数据存储等功能。 ● 在满足工业标准的同时&…

数据结构 -- 树状数组

前言 树状数组或二叉索引树&#xff08;Binary Indexed Tree&#xff09;&#xff0c;又以其发明者命名为 Fenwick 树。其初衷是解决数据压缩里的累积频率的计算问题&#xff0c;现多用于高效计算数列的前缀和、区间和。它可以以 O(logn) 的时间得到任意前缀和。并同时支持在 …

Kali Linux 2024.2 释出

渗透测试发行版 Kali Linux 释出了最新的 2024.2。 主要新特性包括&#xff1a;桌面环境更新到 GNOME 46&#xff0c;Xfce 环境加入 HiDPI 模式&#xff0c;更新了网络侦察工具 AutoRecon&#xff0c;监视 Linux 进程的命令行工具 pspy&#xff0c;提取和显示 CVE 信息的 Splo…

项目验收总体计划书(实际项目验收原件参考Word)

测试目标&#xff1a;确保项目的需求分析说明书中的所有功能需求都已实现&#xff0c;且能正常运行&#xff1b;确保项目的业务流程符合用户和产品设计要求&#xff1b;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 &#xff0…