Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >根据swagger.json生成flutter model,暂无空安全支持

根据swagger.json生成flutter model,暂无空安全支持

作者头像
FreeTimeWorker
发布于 2021-06-10 07:55:30
发布于 2021-06-10 07:55:30
70100
代码可运行
举报
文章被收录于专栏:C#开发点点滴滴C#开发点点滴滴
运行总次数:0
代码可运行

一般的服务端类型都有泛型支持,对于flutter来说虽然也支持泛型,但是在序列化这里却始终存在问题,flutter不允许用反射,对于flutter项目的开发来说除了画页面,可能最烦人的就是跟服务端打交道的时候对对象创建以及序列化,虽然目前网上也有通过json to dart之类的在线工具根据json生成model,但一个项目中那么多类,都这么做一遍太费劲,在有上下级类的情况下需要手动去一个个的调整,烦人,于是写了一个小工具通过 swagger.json 生成flutter model。

1,首先在C#中 我们知道可以的可以生成代码的有razor模板和T4模板,我是基于.net 5开发的于是就顺其自然的使用了当下流行的razor模板来生成代码

在代码引入类库RazorEngine.NetCore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var config = new TemplateServiceConfiguration();
config.Language = Language.CSharp; // CSharp.NET as template language.
config.AllowMissingPropertiesOnDynamic = true;
config.CachingProvider = new DefaultCachingProvider(t => { });
config.EncodedStringFactory = new HtmlEncodedStringFactory(); // Html encoding.
config.Debug = false;
var service = RazorEngineService.Create(config);
var enummodel= File.ReadAllText("fluttermodel.cshtml");
var  result = Engine.Razor.RunCompile(enummodel, "fluttermodel", null, modelsinfo[i]);

result 就是根据模板生成的最终代码,代码量非常少,代码生成中最主要的地方在于传入template的model,model中需要定义一个dart类中需要用到的所有信息,

2 template fluttermodel.cshtml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@using flutter_model_genrate_swagger;
@using System.Linq;
@using System.Text;
@{
    var modeldes = "";
    if (!string.IsNullOrEmpty(Model.Description))
    {
        modeldes = string.Concat("///", Model.Description);
    }
    var modelparams = "";//参数

    var package = "";
    if (Model.Package != null && Model.Package.Count > 0)
    {
        foreach (var pk in Model.Package)
        {
            package += string.Concat("import '", pk, ".dart';\n");
        }
    }
}


@Raw(package)
@Raw(modeldes)
class @Model.Name {
@foreach (var proptey in Model.ModelPropties)
{
    if (!string.IsNullOrEmpty(proptey.Description))
    { 
        @Raw(string.Concat("///", proptey.Description,"\n"))   
    }
    @switch (proptey.Type)
    {
        case "array":
            @{
                string type = string.Concat("List<", @proptey.SubType, ">");
            }
            @Raw(type) @proptey.LowCaseName@(";")
            break;
        case "integer":
            @("int ") @proptey.LowCaseName@(";")
            break;
        case "string":
            @("String ") @proptey.LowCaseName@(";")
            break;
        case "boolean":
            @("bool ") @proptey.LowCaseName@(";")
            break;
        case "number":
            if (proptey.Format == "double")
            {
                @("double ") @proptey.LowCaseName@(";")
            }
            else
            {
                @Raw("///类型不确定")
                @("double ") @proptey.LowCaseName@(";")
            }
            break;
        default:
            @Raw(proptey.Type + " ")@proptey.LowCaseName@(";")
            break;
    }
    @Raw("\n");
    if (string.IsNullOrEmpty(modelparams))
    {
        modelparams += string.Concat("this.", proptey.LowCaseName);
    }
    else
    {
        modelparams += string.Concat(",this.", proptey.LowCaseName);
    }
}
@Model.Name @("({")@modelparams@("});")
@Raw("\n")
@Model.Name@Raw(".fromJson(Map<String, dynamic> json) {") @Raw("\n")
@foreach (var proptey in Model.ModelPropties)
{
    @switch (proptey.Type)
    {
        case "array":
            @{
                string type = string.Concat("List<", @proptey.SubType, ">");
            }
            @Raw("if (json['")@proptey.Name@Raw("'] != null) {")@Raw("\n")
            @proptey.LowCaseName@Raw("=[];")@Raw("\n")
            @Raw("json['")@proptey.Name@Raw("'].forEach((v) {")@Raw("\n")
            @if (proptey.SubTypeDes == "baseType")
            {
                @proptey.LowCaseName@(".add(v);")@Raw("\n")
            }
            else
            {
                @proptey.LowCaseName@(".add(")@proptey.SubType@Raw(".fromJson(v));")@Raw("\n")
            }
            @Raw("});\n")
            @Raw(" } else {\n")
            @proptey.LowCaseName@Raw("=[];\n")
            @Raw("}\n")
            break;
        case "integer":
        case "string":
        case "boolean":
        case "number":
            @proptey.LowCaseName@("=")@Raw("json['") @proptey.Name@Raw("'];")
            break;
        default:
            //判断类型的
            if (proptey.TypeDes == "object")
            {
                @proptey.LowCaseName@Raw("=json['")@proptey.Name@Raw("']!=null? ")@proptey.Type@Raw(".fromJson(json['")@proptey.Name@Raw("']) : null;\n")
            }
            else
            {
                @proptey.LowCaseName@("=")@Raw("json['") @proptey.Name@Raw("'];")
            }
            break;
    }
    @Raw("\n");
}
}
@Raw("Map<String, dynamic> toJson() { \n")
@Raw("final Map<String, dynamic> data = new Map<String, dynamic>();\n")
@foreach (var proptey in Model.ModelPropties)
{
    switch (proptey.Type)
    {
        case "integer":
        case "string":
        case "boolean":
        case "number":
            @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(";\n")
            break;
        case "array":
            //data['Data'] = this.data.map((v) => v.toJson()).toList();
            @Raw("if (this.")@proptey.LowCaseName@Raw(" != null) { \n")

            @if (proptey.SubTypeDes == "baseType")
            {
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(".toList();\n")
            }
            else
            {
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(".map((v) => v.toJson()).toList();\n")
            }
            @Raw("}\n")

            break;//普通对象
        default:
            if (proptey.TypeDes == "object")
            {

                @Raw("if (this.")@proptey.LowCaseName@Raw(" != null) { \n")
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(".toJson();\n")
                @Raw("}\n")
            }
            else
            {
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(";\n")
            }
            break;
    }
}
@Raw("return data;\n")
@Raw("}\n")

}

3 传入template的类定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum ModelInfoType
    { 
        Obj,
        Enum
    }
    public class ModelInfo
    {
        public ModelInfo() {
            ModelPropties = new List<ModelPropty>();
        }
        public ModelInfoType Type { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public List<ModelPropty> ModelPropties { get; set; }

        public string LowCaseName
        {
            get
            {
                if (string.IsNullOrEmpty(Name) || Name.Length < 2)
                {
                    return Name;
                }
                else
                { 
                    return Name.Substring(0, 1).ToLower() + Name.Substring(1);
                }
            }
        }
        public List<string> Package
        {
            get
            {
                if (this.ModelPropties.Count == 0)
                {
                    return null;
                }
                else
                {
                    var result = new List<string>();
                    foreach (var item in ModelPropties)
                    {
                        if (item.Type == "array")//包含arry
                        {
                            if (string.IsNullOrEmpty(item.SubType))
                            {
                                if (!ServiceAgent.BaseTypes.Contains(item.Type))
                                {
                                    result.Add(item.Type.Substring(0, 1).ToLower() + item.Type.Substring(1));
                                }
                               
                            }
                            else
                            {
                                if (!ServiceAgent.BaseTypes.Contains(item.SubType.ToLower()))
                                {
                                    result.Add(item.SubType.Substring(0, 1).ToLower() + item.SubType.Substring(1));
                                }
                            }
                        }
                        else if (!ServiceAgent.BaseTypes.Contains(item.Type))//基础类型外
                        {
                            result.Add(item.Type.Substring(0, 1).ToLower() + item.Type.Substring(1));
                        }
                    }
                    return result;
                }
            }
        }


    }

    public class ModelPropty
    { 
        public string Name { get; set; }
        /// <summary>
        /// List<....> | 具体类型
        /// </summary>
        public string Type { get; set; }
        /// <summary>
        /// 如果是arry,这里是arry的子类,
        /// </summary>
        public string SubType { get; set; }
        /// <summary>
        /// 子类描述
        /// </summary>
        public string SubTypeDes { get; set; }
        /// <summary>
        /// 类型描述
        /// </summary>
        public string TypeDes { get; set; }
        public string Format { get; set; }

        public string Description { get; set; }

        public string LowCaseName
        {
            get
            {
                if (string.IsNullOrEmpty(Name)|| Name.Length<2)
                {
                    return Name;
                }
                else
                {
                    return Name.Substring(0, 1).ToLower() + Name.Substring(1);
                }
            }
        }
    }

4 接下去的事情就简单了,把swagger.json下载到本地,用system.text.json解析拿到swagger.json中的所有model,挨个生成

5 最后调用flutter format {文件夹位置} 将所有生成的model类格式化一遍,如果这里发生错误,手动执行以下命令就大功告成了。

6 最后附上项目地址: https://gitee.com/zzf_1/flutter-model-genrate-swagger

release版本下载地址:https://gitee.com/zzf_1/flutter-model-genrate-swagger/tags 【release版本稍微有点大,但是release版本不需要.net环境,对于专职flutter的开发人员来说这个应该会比较有用】

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET WebAPI 测试文档 (Swagger)
SwaggerUI是一个简单的Restful API测试和文档工具。简单、漂亮、易用(官方demo)。通过读取JSON配置显示API .项目本身仅仅也只依赖一些html,css,js静态文件.你可以几乎放在任何Web容器上使用
HueiFeng
2020/02/12
1.8K0
sqlserver 备份还原数据库
using Chloe.SqlServer; using System; using System.Collections.Generic; using System.IO; namespace bak { class Program { static void Main(string[] args) { Console.WriteLine("还原/备份(restore/backup):"); var rep =
FreeTimeWorker
2021/08/18
3.7K0
【swagger】C# 中 swagger 的使用及避坑
开发 web api 的时候,写文档是个痛苦的事情,而没有文档别人就不知道怎么调用,所以又不得不写。
丹枫无迹
2020/04/08
7.3K0
【swagger】C# 中 swagger 的使用及避坑
webapi文档描述-swagger
用户1168362
2018/01/05
1.7K0
webapi文档描述-swagger
自己动手写一个简单的MVC框架(第一版)
  路由(Route)、控制器(Controller)、行为(Action)、模型(Model)、视图(View)
Edison Zhou
2018/08/20
1K0
自己动手写一个简单的MVC框架(第一版)
Word报告自动生成(例如 导出数据库结构)
        将很早之前写的一个小组件重新整理优化一下,做成一个通用的功能。适用于导出数据库的结构(表、字段等)到Word或将体检数据自动生成Word版的体检报告等。代码:Github
FlyLolo
2018/12/13
3.5K0
Word报告自动生成(例如 导出数据库结构)
C#操作json的通用帮助类
using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Reflection; using System.Data.Common; using System.Collections; using System.IO; using System.Text.RegularExpressions; using System.Runtime.Serialization.Jso
用户7108768
2021/11/02
1.3K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
我们之前做了验证码,登录界面,却没有登录实际的代码,我们这次先把用户登录先完成了,要不权限是讲不下去了 把我们之前的表更新到EF中去 登录在Account控制器,所以我们要添加Account的Mode
用户1149182
2018/01/16
2.7K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(19)-权限管理系统-用户登录
mvc一对多模型表单的快速构建
Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单。如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?) A2:拆分多个模型,映射就没啥问题了。但......有点麻烦啊~~
易墨
2018/09/14
1.6K0
mvc一对多模型表单的快速构建
C# 处理Word自动生成报告 四、程序处理
现在说一下程序处理部分,有点长 本来是想做针对doc和docx的模板两个版本, 后来想到可以在生成的时候saveas里设置格式, 所以此版只支持对docx的模板处理, 想要doc的情况可以选择生成格式为doc的. 上代码: public class WordHelper { private Word.Application wordApp = null; private Word.Document wordDoc = null; private D
FlyLolo
2018/05/17
2K0
T4模板生成代码。 数据实体层与数据仓储层。备注
文件下载连接 http://download.csdn.net/download/drawdream/9916255
蓝夏
2022/05/10
6260
.NET常用的扩展方法整理
using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; namespace IBO.XJMYQP.Utility { public static class Extens
跟着阿笨一起玩NET
2018/09/19
1.2K0
List,DataTable实现行转列的通用方案
本文通过行转列引出System.Linq.Dynamic,并介绍了过滤功能,其实它的用处还有很多,等待大家发掘。
用户1168362
2018/01/05
2K0
List,DataTable实现行转列的通用方案
C#笔记:Ueditor上传文件引入数据库
项目下载:http://pan.baidu.com/s/1gd8aJvH 密码:qu4c
超级大猪
2019/11/22
6670
DotNet处理服务器路径的方法
该文介绍了处理服务器路径的方法,包括验证设置路径字符串、查看服务器的路径、删除目录等操作。
彭泽0902
2018/01/04
8800
字符串表达式计算(a+b/(a-b))的思路与实践
想要实现上面这个功能,需要先了解诸如 (a+1-(2+a)*3/3)/a+3 这个是什么?
易墨
2023/11/01
3890
字符串表达式计算(a+b/(a-b))的思路与实践
C#设备处理类操作
C#对于处理window操作系统下的设备有天然的优势,对于大多数设备读写等操作来说基本上够了,这里只讨论通过普通的大多数的设备的操作。涉及到两大类SerialPort类,Socket的一些操作。不一定好,但希望分享出去,让更多的人受益。。
FreeTimeWorker
2020/08/31
6380
初学者不会写接口怎么办?微软Visual Studio 2022无脑式API接口创建——Swagger一键导入APIKit快速测试
主页链接:【Visual Studio 2022 IDE - 适用于软件开发人员的编程工具】
红目香薰
2023/04/03
1.5K0
初学者不会写接口怎么办?微软Visual Studio 2022无脑式API接口创建——Swagger一键导入APIKit快速测试
微信小程序支付服务端.net core实现,简单直接
做小程序的支付时,在翻阅了大量的别人分享的代码后,感觉写的简直就是一堆垃圾,不敢苟同,要是代码都那么写,维护性简直了,于是才有了这篇文章。
FreeTimeWorker
2020/08/31
9220
使用RestSharp 库消费Restful Service
现在互联网上的服务接口都是Restful的,SOAP的Service已经不是主流。.NET/Mono下如何消费Restful Service呢,再也没有了方便的Visual Studio的方便生产代理的工具了,你还在用HttpWebRequest 自己封装吗?Restful Service还有授权问题,自己写出来的代码是不是很不优雅?通常Restful Service返回的数据格式是XML或者Json,还要设置服务的输入参数等等,使用起来很复杂。本文向你推荐一个开源的库RestSharp轻松消费Restfu
张善友
2018/01/22
1.3K0
推荐阅读
相关推荐
ASP.NET WebAPI 测试文档 (Swagger)
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验