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

2024-06-06 10:20

本文主要是介绍[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();
}

 

 

 

这篇关于[flutter]一键将YAPI生成的api.json文件转为需要的Dart Model类的脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035831

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by