123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <!--
- * @Author: XianKaiQun
- * @Date: 2020-04-13 09:19:31
- * @LastEditors: WuWei
- * @LastEditTime: 2020-06-17 09:07:09
- * @Descripttion: kuaisu
- -->
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- </head>
- <script>
- window.onload = function () {
- ///从本地获取之前缓存的数据
- document.getElementById("json").value = localStorage.getItem('json1');
- document.getElementById("jsons").value = localStorage.getItem('json2');
- document.getElementById("className").value = localStorage.getItem('className');
- if (localStorage.getItem('json1') && localStorage.getItem('json2') && localStorage.getItem('className')) {
- json2dart();
- }
- }
- function change1() {
- var b = document.getElementById("json").value;
- localStorage.setItem('json1', b);
- }
- function change2() {
- var b = document.getElementById("jsons").value;
- localStorage.setItem('json2', b);
- }
- function change3() {
- var b = document.getElementById("className").value;
- localStorage.setItem('className', b);
- }
- function parse() {
- var a = localStorage.getItem('json1');
- var b = localStorage.getItem('json2');
- var back = {};
- try {
- if (a) {
- back = {
- ...back,
- ...JSON.parse(a)
- };
- }
- if (b) {
- back = {
- ...back,
- ...JSON.parse(b)
- };
- }
- } catch (error) {
- alert('json格式可能存在错误')
- }
- return back;
- }
- //判断类型
- function dateType(data) {
- let back = "int"
- if (data === null) back = "dynamic"
- else if (typeof data == "undefined") back = "dynamic"
- else if (data.constructor === Array) back = "List"
- else if (data.constructor === Boolean) back = "bool"
- else if (data.constructor === String) back = "String"
- else if (data.constructor === Object) back = "Map"
- else if (data.constructor === Number) back = "num"
- // else if (data.constructor === Number) back = (data + ".0" != data) ? "double" : "int"
- else back = "dynamic"
- return back
- }
- //转驼峰
- function tf(str) {
- var strArr = str.split('/');
- for (var i = 1; i < strArr.length; i++) {
- strArr[i] = strArr[i].charAt(0).toUpperCase() + strArr[i].substring(1);
- }
- str = strArr.join('')
- strArr = str.split('_');
- for (var i = 1; i < strArr.length; i++) {
- strArr[i] = strArr[i].charAt(0).toUpperCase() + strArr[i].substring(1);
- }
- str = strArr.join('')
- strArr = str.split('-');
- for (var i = 1; i < strArr.length; i++) {
- strArr[i] = strArr[i].charAt(0).toUpperCase() + strArr[i].substring(1);
- }
- str = strArr.join('')
- return str;
- };
- //首字母大写
- function upper(data) {
- return data.replace(/\b\w+\b/g, function (word) {
- return word.substring(0, 1).toUpperCase() + word.substring(1)
- })
- }
- //构造
- function buildClass(json, thisClassName) {
- var className = thisClassName;
- className = upper(tf(className));
- let definedStr = `` //构造函数
- let initializeStr = `` // 初始化
- let fromJsonStr = `` //fromJson
- let toJsonStr = `` //toJson
- let back = ``
- const fields = Object.keys(json)
- fields.forEach(field => {
- const _data = json[field]
- const _dataType = dateType(_data)
- let childClassName = upper(tf(field))+'Of'+className
- // Map类型 需要递归build新的class
- if (_dataType == "Map") {
- back = back + buildClass(_data, childClassName)
- // 定义
- definedStr += `${childClassName} ${field} ;\r\n`
- initializeStr += `this.${field},\r\n`
- fromJsonStr += `${field}= ${childClassName}.fromJson(map["${field}"]??{});\r\n`
- toJsonStr += `json['${field}'] = this.${tf(field)}.toJson();\r\n`
- }
- // List类型且孩子为Map 需要传入list【0】递归build新的class
- else if (_dataType == "List" && dateType(_data[0]) == "Map") {
- back = back + buildClass(_data[0], childClassName)
- // 定义
- definedStr += `List<${childClassName}> ${field};\r\n`
- initializeStr += `this.${field},\r\n`
- fromJsonStr += `${field}= List<${childClassName}>.from((map["${field}"]?? []).map((x) => ${childClassName}.fromJson(x)));\r\n`
- toJsonStr += `json['${field}']=List<dynamic>.from((${field}??[]).map((x) => x.toJson()));\r\n`;
- }
- // List类型 孩子不是Map (一维数组)
- else if (_dataType == "List" && dateType(_data[0]) != "Map") {
- // 定义
- definedStr += `List<${dateType(_data[0])}> ${field};\r\n`
- initializeStr += `this.${field},\r\n`
- fromJsonStr += `${tf(field)}=map['${field}'].cast<${dateType(_data[0])}>();\r\n`
- toJsonStr += ` json['${field}'] = this.${tf(field)};\r\n`
- } else {
- definedStr += `${_dataType} ${field};\r\n`
- initializeStr += `this.${field},\r\n`
- fromJsonStr += `${tf(field)} = map['${field}'];\r\n`
- toJsonStr += `json['${field}'] = this.${tf(field)};\r\n`
- }
- })
- //构造函数
- initializeStr = `${className}({${initializeStr}});`
- //fromJson
- fromJsonStr = `\r\n${className}.fromJson(json) {
- \r\nMap<String, dynamic> map = Map.from(json ?? {});
- \r\n${fromJsonStr}
- \r\n}`
- //toJson
- toJsonStr = `
- \r\nMap<String, dynamic> toJson() {
- \r\nMap<String, dynamic> json = Map<String, dynamic>();
- \r\n${toJsonStr}
- \r\nreturn json;
- \r\n}`
- back = `\r\nclass ${className}{
- \r\n${definedStr}
- \r\n${initializeStr}
- \r\n${fromJsonStr}
- \r\n${toJsonStr}
- \r\n}
- \r\n${back}`
- return back
- }
- //清空
- function clear1() {
- document.getElementById("json").value = '';
- }
- //转换
- function json2dart() {
- let className = localStorage.getItem('className');
- if (!className) className = 'Empty';
- className+='Model'
- let json = parse();
- var str = buildClass(json, className);
- document.getElementById("dart").value = str;
- }
- //复制
- function copydart() {
- var Url2 = document.getElementById("dart")
- Url2.select() // 选择对象
- document.execCommand("Copy") // 执行浏览器复制命令
- alert("复制成功")
- }
- </script>
- <body>
- <div class="box">
- <div style="
- flex-direction: column;
- height: 80vh;
- width: 50%;
- margin-right: 10px;">
- <textarea id="json" onchange="change1()" style="height: 70%;" placeholder="json code.."></textarea>
- <button onClick="clear1()" style="height: 40px;">清空</button>
- <textarea id="jsons" onchange="change2()" style="height:30%;" placeholder="jsons code.."></textarea>
- </div>
- <textarea id="dart" style="width: 50%;"></textarea>
- </div>
- <div style=" display: flex;flex-direction: row;justify-content: center;margin:40px ">
- <input id="className" onchange="change3() " placeholder=" className.." style="margin:0 40px;width:300px;" />
- <input type="button" onClick="json2dart()" value="json to dart" style="margin:0 40px" />
- <input type="button" onClick="copydart()" style="margin:0 40px" value="复制代码" />
- </div>
- </body>
- </html>
- <style>
- .box,
- .box div {
- display: flex;
- font-family: "verdana";
- }
- </style>
|