diff --git "a/Image/UWP\345\256\211\350\243\2051.png" "b/Image/UWP\345\256\211\350\243\2051.png" deleted file mode 100644 index 2a5addd..0000000 Binary files "a/Image/UWP\345\256\211\350\243\2051.png" and /dev/null differ diff --git "a/Image/UWP\345\256\211\350\243\2052.png" "b/Image/UWP\345\256\211\350\243\2052.png" deleted file mode 100644 index 1bb3a01..0000000 Binary files "a/Image/UWP\345\256\211\350\243\2052.png" and /dev/null differ diff --git "a/Image/WPF\345\256\211\350\243\205.png" "b/Image/WPF\345\256\211\350\243\205.png" deleted file mode 100644 index 92b89a3..0000000 Binary files "a/Image/WPF\345\256\211\350\243\205.png" and /dev/null differ diff --git "a/Image/\345\261\236\346\200\247\350\256\277\351\227\256\345\231\250.png" "b/Image/\345\261\236\346\200\247\350\256\277\351\227\256\345\231\250.png" deleted file mode 100644 index 6f107fb..0000000 Binary files "a/Image/\345\261\236\346\200\247\350\256\277\351\227\256\345\231\250.png" and /dev/null differ diff --git "a/Image/\346\265\217\350\247\210\345\231\250.png" "b/Image/\346\265\217\350\247\210\345\231\250.png" deleted file mode 100644 index 9cc8fa4..0000000 Binary files "a/Image/\346\265\217\350\247\210\345\231\250.png" and /dev/null differ diff --git "a/Image/\347\225\214\351\235\242.png" "b/Image/\347\225\214\351\235\242.png" deleted file mode 100644 index 484a019..0000000 Binary files "a/Image/\347\225\214\351\235\242.png" and /dev/null differ diff --git a/README-ZH.md b/README-ZH.md new file mode 100644 index 0000000..a146b15 --- /dev/null +++ b/README-ZH.md @@ -0,0 +1,198 @@ +![](https://github.com/fluttercandies/JsonToDart/blob/master/UWP/Assets/Wide310x150Logo.scale-400.png) + +功能最全面的 Json 转换 Dart 的工具,支持 Windows,Mac,Web。 + +Language: [English](README.md) | 中文简体 +- [下载](#下载) +- [使用](#使用) + - [格式化](#格式化) + - [设置](#设置) + - [数据保护](#数据保护) + - [数组保护](#数组保护) + - [遍历数组次数](#遍历数组次数) + - [属性命名](#属性命名) + - [属性排序](#属性排序) + - [添加保护方法](#添加保护方法) + - [空安全](#空安全) + - [文件头信息](#文件头信息) + - [属性只读](#属性只读) + - [可空](#可空) + - [多语言](#多语言) + - [修改类信息](#修改类信息) + - [生成Dart](#生成dart) + +# 下载 + +Github下载速度太慢,为了方便大家下载,特意在gitee也创建了下载地址。 + +[Flutter for Windows](https://gitee.com/zmtzawqlp/JsonToDart/releases/) + +[Flutter for Macos](https://gitee.com/zmtzawqlp/JsonToDart/releases/) + +[Flutter for Web](https://zmtzawqlp.gitee.io/jsontodart/) + +[UWP 微软商店](https://www.microsoft.com/store/apps/9NBRW9451QSR) 功能未同步,以后会替换成 [Flutter for UWP](https://github.com/flutter/flutter/issues/14967) + +# 使用 + +## 格式化 + +点击格式化按钮,将 Json 转换为右边可视化的 Dart 类结构 + +## 设置 +### 数据保护 + +大家一定会有被服务端坑的时候吧? 不按规定好了的数据类型传值,导致 Json 整个解析失败。 + +打开这个开关,就会在获取数据的时候加一层保护,代码如下 + +```dart +class FFConvert { + FFConvert._(); + static T? Function(dynamic value) convert = + (dynamic value) { + if (value == null) { + return null; + } + return json.decode(value.toString()) as T?; + }; +} + +T? asT(dynamic value, [T? defaultValue]) { + if (value is T) { + return value; + } + try { + if (value != null) { + final String valueS = value.toString(); + if ('' is T) { + return valueS as T; + } else if (0 is T) { + return int.parse(valueS) as T; + } else if (0.0 is T) { + return double.parse(valueS) as T; + } else if (false is T) { + if (valueS == '0' || valueS == '1') { + return (valueS == '1') as T; + } + return (valueS == 'true') as T; + } else { + return FFConvert.convert(value); + } + } + } catch (e, stackTrace) { + log('asT<$T>', error: e, stackTrace: stackTrace); + return defaultValue; + } + + return defaultValue; +} +``` + +你也可以重写 [FFConvert.convert] 来处理特殊的情况,比如 +``` dart + FFConvert.convert = (dynamic value) { + if (value == null) { + return null; + } + final dynamic output = json.decode(value.toString()); + if ([] is T && output is List) { + return output.map((dynamic e) => asT(e)).toList() as T; + } else if ({} is T && output is Map) { + return output.map((dynamic key, dynamic value) => + MapEntry(key.toString(), value.toString())) as T; + } else if (const TestMode() is T && output is Map) { + return TestMode.fromJson(output) as T; + } + + return json.decode(value.toString()) as T?; + }; +``` + +### 数组保护 + +在循环数组的时候,一个出错,导致 Json 整个解析失败的情况,大家遇到过吧? + +打开这个开关,将对每一次循环解析进行保护,代码如下 + +```dart +void tryCatch(Function f) { + try { + f?.call(); + } catch (e, stack) { + debugPrint("$e"); + debugPrint("$stack"); + } +} +``` + +### 遍历数组次数 + +在服务器返回的数据中,有时候数组里面不是每一个元素都带有全部的属性, + +如果只检查第一个话,会存在属性丢失的情况 + +你可以通过多次循环来避免丢失属性 + +选项有1,20,99 + +99就代表循环全部进行检查 + +### 属性命名 + +属性命名规范选项:保持原样,驼峰式命名小驼峰,帕斯卡命名大驼峰,匈牙利命名下划线 + +[Dart 命名规范](https://dart.dev/guides/language/effective-dart/style) + +Dart 官方推荐 驼峰式命名小驼峰 + +### 属性排序 + +对属性进行排序 + +排序选项: 保持原样,升序排列,降序排序 + +### 添加保护方法 + +是否添加保护方法,数据保护/数组保护的方法。 +第一次使用的时候开启就可以了,你可以把方法提出去,后面生成 Dart 就没有必要每个文件里面都包含这2个方法。 + +### 空安全 + +打开空安全,将生成空安全代码。 + +### 文件头信息 + +可以在这里添加 Copyright,Improt dart,创建人信息等等,支持[Date yyyy MM-dd]来生成时间,Date 后面为日期格式。 + +比如[Date yyyy MM-dd] 会将你生成Dart代码的时间按照 yyyy MM-dd 的格式生成对应时间 + +### 属性只读 + +点击格式化之后,右边会显示可视化的 Dart 类结构,在顶部会有下拉选项 + +选项:none,final +### 可空 + +在空安全打开的前提,设置属性是否可以为空。 + +## 多语言 + +支持中文简体,中文繁体和英文。 + +## 修改类信息 + +点击格式化之后,右边会显示可视化的 Dart 类结构。 + +第一列为在 Json 中对应的key + +第二列为属性类型/类的名字。如果是类名,会用黄色背景提示 + +第三列是属性的名字 + +输入项如果为空,会报红提示 + +## 生成Dart + +做好设置之后,点击生成按钮,左边就会生成 Json 对于的 Dart 代码,并且提示成功,代码自动复制到剪切板。 + diff --git a/README.md b/README.md index 124f8ce..af17724 100644 --- a/README.md +++ b/README.md @@ -1,182 +1,113 @@ ![](https://github.com/fluttercandies/JsonToDart/blob/master/UWP/Assets/Wide310x150Logo.scale-400.png) -[功能最全面的Json转换Dart的工具](https://juejin.im/post/5d1463245188255d0d2f5c81),支持Windows,Mac,Web以及Linux。 -相关: -- [uwp](https://baike.so.com/doc/23718184-24274055.html) -- [wpf](https://baike.so.com/doc/2917373-3078588.html) -- [silverlight](https://baike.so.com/doc/5402730-5640416.html) -- [flutter](https://github.com/flutter/flutter) -- [flutter-desktop](https://github.com/google/flutter-desktop-embedding) -- [flutter-web](https://github.com/flutter/flutter_web) -- [go-flutter](https://github.com/go-flutter-desktop/go-flutter) -- [go](https://github.com/golang/go) -- [hover](https://github.com/go-flutter-desktop/hover) +The tool to convert json to dart code, support Windows,Mac,Web。 -Flutter Candies qq群181398081 +Language: English | [中文简体](README-ZH.md) +- [Download](#download) +- [Use](#use) + - [Format](#format) + - [Setting](#setting) + - [Data Protection](#data-protection) + - [Array Protection](#array-protection) + - [Traverse Array Count](#traverse-array-count) + - [Property Rule](#property-rule) + - [Order Property](#order-property) + - [Add Method](#add-method) + - [NullSafety](#nullsafety) + - [File Header](#file-header) + - [Property Readonly](#property-readonly) + - [Nullable](#nullable) + - [Localizations](#localizations) + - [Edit Class Info](#edit-class-info) + - [Generate](#generate) -- [下载](#%e4%b8%8b%e8%bd%bd) -- [安装](#%e5%ae%89%e8%a3%85) - - [UWP(Windows10)](#uwpwindows10) - - [WPF(Windows7/Windows8)](#wpfwindows7windows8) - - [Silverlight(Web)](#silverlightweb) - - [Flutter(Mac)](#fluttermac) - - [Flutter(Windows_x64)](#flutterwindowsx64) -- [使用](#%e4%bd%bf%e7%94%a8) - - [格式化](#%e6%a0%bc%e5%bc%8f%e5%8c%96) - - [更多设置](#%e6%9b%b4%e5%a4%9a%e8%ae%be%e7%bd%ae) - - [数据类型全方位保护](#%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b%e5%85%a8%e6%96%b9%e4%bd%8d%e4%bf%9d%e6%8a%a4) - - [数组全方位保护](#%e6%95%b0%e7%bb%84%e5%85%a8%e6%96%b9%e4%bd%8d%e4%bf%9d%e6%8a%a4) - - [遍历数组次数](#%e9%81%8d%e5%8e%86%e6%95%b0%e7%bb%84%e6%ac%a1%e6%95%b0) - - [属性命名](#%e5%b1%9e%e6%80%a7%e5%91%bd%e5%90%8d) - - [属性排序](#%e5%b1%9e%e6%80%a7%e6%8e%92%e5%ba%8f) - - [添加保护方法](#%e6%b7%bb%e5%8a%a0%e4%bf%9d%e6%8a%a4%e6%96%b9%e6%b3%95) - - [文件头部信息](#%e6%96%87%e4%bb%b6%e5%a4%b4%e9%83%a8%e4%bf%a1%e6%81%af) - - [属性访问器类型](#%e5%b1%9e%e6%80%a7%e8%ae%bf%e9%97%ae%e5%99%a8%e7%b1%bb%e5%9e%8b) - - [修改json类信息](#%e4%bf%ae%e6%94%b9json%e7%b1%bb%e4%bf%a1%e6%81%af) - - [生成Dart](#%e7%94%9f%e6%88%90dart) +# Download -# 下载 +[Flutter for Windows](https://github.com/fluttercandies/JsonToDart/releases/) -Github下载速度太慢,为了方便大家下载,特意在gitee也创建了下载地址。 +[Flutter for Macos](https://github.com/fluttercandies/JsonToDart/releases/) -[UWP 微软商店](https://www.microsoft.com/store/apps/9NBRW9451QSR) +[Flutter for Web](https://fluttercandies.github.io/JsonToDart/) -[WPF for Windows](https://gitee.com/zmtzawqlp/JsonToDart/releases) +[Microsoft Store](https://www.microsoft.com/store/apps/9NBRW9451QSR) The function is not ,it will replace with [Flutter for UWP](https://github.com/flutter/flutter/issues/14967) in the future. -[UWP for Windows10](https://gitee.com/zmtzawqlp/JsonToDart/releases) +# Use -[Flutter for Macos](https://gitee.com/zmtzawqlp/JsonToDart/releases) +## Format -[Flutter for Web](https://zmtzawqlp.gitee.io/jsontodartflutterweb) +Click Format button, it will convert the Json string into Dart class structure. +## Setting +### Data Protection -| 平台 | 语言 | 描述 | 代码/安装包地址 | -| ------- | ---- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| windows | C# | uwp构建,运行环境windows10,x86/x64 | [微软商店](https://www.microsoft.com/store/apps/9NBRW9451QSR) 以及 [windows-uwp.zip](https://github.com/fluttercandies/JsonToDart/releases) | -| windows | C# | wpf构建,运行环境windows10/windows8/widnows7,x86/x64 | [windows-wpf.zip](https://github.com/fluttercandies/JsonToDart/releases) | -| windows | dart | flutter构建, 使用[官方方式](https://github.com/google/flutter-desktop-embedding)编译,x64 ,debug版本 | [windows-x64-flutter.zip](https://github.com/fluttercandies/JsonToDart/releases) | -| windows | dart | flutter构建, 使用[go-flutter](https://github.com/go-flutter-desktop/go-flutter)编译,x64 ,debug版本 | [windows-x64-go-flutter.zip](https://github.com/fluttercandies/JsonToDart/releases) | -| mac | dart | flutter构建,使用[go-flutter](https://github.com/go-flutter-desktop/go-flutter)编译(官方方式,未找到产物) | [mac-go-flutter.zip](https://github.com/fluttercandies/JsonToDart/releases) | -| web | C# | [silverlight](https://baike.so.com/doc/5402730-5640416.html)构建, 需要安装silverlight插件,有浏览器限制 | [网页地址](https://fluttercandies.github.io/JsonToDart)和[带字体文件网页地址](https://fluttercandies.github.io/JsonToDartWeb) | -| web | dart | [flutter-web](https://github.com/flutter/flutter_web)构建 | [网页地址]( https://fluttercandies.github.io/JsonToDartFlutterWeb/) | -| linux | dart | flutter构建, 使用官方方式编译,(没有环境测试,假装可以用) | [代码地址](https://github.com/fluttercandies/JsonToDart/tree/master/Flutter/desktop) | - -# 安装 -## UWP(Windows10) - -[微软商店](https://www.microsoft.com/store/apps/9NBRW9451QSR) - -商店大姨妈的时候,可以直接下载安装包 - -Windows10 用户 - -下载好安装包,解压。 - -第一次安装,需要安装证书,请按照下图,使用PowerShell打开Add-AppDevPackage.ps1,一路接受就安装完毕 - -![](https://github.com/fluttercandies/JsonToDart/blob/master/Image/UWP安装1.png) - -后面如果工具有更新,可以下载最新的,然后点击FlutterCandiesJsonToDart_x.0.x.0_x86_x64.appxbundle 安装 - -![](https://github.com/fluttercandies/JsonToDart/blob/master/Image/UWP安装2.png) - -## WPF(Windows7/Windows8) - -Windows7/Windows8 用户 - -下载解压,点击setup.exe安装 - -![](https://github.com/fluttercandies/JsonToDart/blob/master/Image/WPF安装.png) - -## Silverlight(Web) - -带字体文件是因为可能有乱码,由于中文字体问题,包含了中文字体文件,第一次会比较久,请耐心等待 - -首先需要安装[Silverlight](https://www.microsoft.com/getsilverlight/get-started/install/default?reason=unsupportedbrowser&_helpmsg=ChromeVersionDoesNotSupportPlugins#sysreq) - -Mac的用户下载Mac的,Windows用户下载Windows的 - -然后就是浏览器问题了,因为支持Silverlight的浏览器是有限的,除了Internet Explorer支持,以下版本的浏览器也支持. - -![](https://github.com/fluttercandies/JsonToDart/blob/master/Image/浏览器.png) - -Mac [Safari 12.0以下的可以尝试这样开启插件](https://www.cnblogs.com/qiumingshanshangjian/p/8413165.html) - -Mac [Firefox](https://mac.filehorse.com/download-firefox/7957/download/)这个版本能使用 - -## Flutter(Mac) - -go-flutter生成的产物是二进制程序,运行为exec,可以双击打开, -后由[低调大佬](https://github.com/CaiJingLong)测试打包[DMG](https://studygolang.com/articles/14480),安装即可,注意在安全性与隐私中同意安装,具体如何打包可以查看[Go Flutter Desktop (二) go 二进制程序打包为 mac app(dmg)](https://www.kikt.top/posts/flutter/desktop/go-desktop-engine/flutter-go-desktop-2/) - -## Flutter(Windows_x64) - -flutter官方产物或者go-flutter产物为exe,点击exe启动 - -# 使用 - -![](https://github.com/fluttercandies/JsonToDart/blob/master/Image/界面.png) - - -左边是json的输入框以及最后Dart生成的代码,右边是生成的Json类的结构 - -## 格式化 - -点击格式化按钮,将json转换为右边可视化的json类结构 - -## 更多设置 - -设置会全部自动保存(flutter版本除外,需要手动保存),一次设置终身受益 - -### 数据类型全方位保护 - -大家一定会有被服务端坑的时候吧? 不按规定好了的数据类型传值,导致json整个解析失败。 - -打开这个开关,就会在获取数据的时候加一层保护,代码如下 + It will protect data when convert data as T safety. ```dart -dynamic convertValueByType(value, Type type, {String stack: ""}) { - if (value == null) { - debugPrint("$stack : value is null"); - if (type == String) { - return ""; - } else if (type == int) { - return 0; - } else if (type == double) { - return 0.0; - } else if (type == bool) { - return false; +class FFConvert { + FFConvert._(); + static T? Function(dynamic value) convert = + (dynamic value) { + if (value == null) { + return null; } - return null; - } + return json.decode(value.toString()) as T?; + }; +} - if (value.runtimeType == type) { +T? asT(dynamic value, [T? defaultValue]) { + if (value is T) { return value; } - var valueS = value.toString(); - debugPrint("$stack : ${value.runtimeType} is not $type type"); - if (type == String) { - return valueS; - } else if (type == int) { - return int.tryParse(valueS); - } else if (type == double) { - return double.tryParse(valueS); - } else if (type == bool) { - valueS = valueS.toLowerCase(); - var intValue = int.tryParse(valueS); - if (intValue != null) { - return intValue == 1; + try { + if (value != null) { + final String valueS = value.toString(); + if ('' is T) { + return valueS as T; + } else if (0 is T) { + return int.parse(valueS) as T; + } else if (0.0 is T) { + return double.parse(valueS) as T; + } else if (false is T) { + if (valueS == '0' || valueS == '1') { + return (valueS == '1') as T; + } + return (valueS == 'true') as T; + } else { + return FFConvert.convert(value); + } } - return valueS == "true"; + } catch (e, stackTrace) { + log('asT<$T>', error: e, stackTrace: stackTrace); + return defaultValue; } + + return defaultValue; } ``` -### 数组全方位保护 +you can override [FFConvert.convert] to handle special case. +``` dart + FFConvert.convert = (dynamic value) { + if (value == null) { + return null; + } + final dynamic output = json.decode(value.toString()); + if ([] is T && output is List) { + return output.map((dynamic e) => asT(e)).toList() as T; + } else if ({} is T && output is Map) { + return output.map((dynamic key, dynamic value) => + MapEntry(key.toString(), value.toString())) as T; + } else if (const TestMode() is T && output is Map) { + return TestMode.fromJson(output) as T; + } -在循环数组的时候,一个出错,导致json整个解析失败的情况,大家遇到过吧? + return json.decode(value.toString()) as T?; + }; +``` -打开这个开关,将对每一次循环解析进行保护,代码如下 +### Array Protection + +It can protect your array in case of one has some error. ```dart void tryCatch(Function f) { @@ -189,64 +120,64 @@ void tryCatch(Function f) { } ``` -### 遍历数组次数 - -在服务器返回的数据中,有时候数组里面不是每一个item都带有全部的属性, +### Traverse Array Count -如果只检查第一个话,会存在属性丢失的情况 +The first object may be not has all properties. -你可以通过多次循环来避免丢失属性 +We can slove it by setting traverse array count. It will traverse the array and merge the object. -选项有1,20,99 +1, 20, and 99 options are provided. -99就代表循环全部进行检查 +99 means traverse all of the array. -### 属性命名 +### Property Rule -属性命名规范选项:保持原样,驼峰式命名小驼峰,帕斯卡命名大驼峰,匈牙利命名下划线 +none,camel case,pascal,hungarian notation -[Dart 命名规范](https://dart.dev/guides/language/effective-dart/style) +[Dart rule](https://dart.dev/guides/language/effective-dart/style) -Dart 官方推荐 驼峰式命名小驼峰 +camel case is recommended. -### 属性排序 +### Order Property -对属性进行排序 +none,ascending,descending +### Add Method -排序选项: 保持原样,升序排列,降序排序 +Whether add [Data Protection] and [Array Protection]. +In fact, you only need it at first time then extract it into your code and import it. +### NullSafety -### 添加保护方法 +Support to generate null-safety code. -是否添加保护方法。数据类型全方位保护/数组全方位保护 这2个开启的时候会生成方法。第一次使用的时候开启就可以了,你可以方法提出去,后面生成Dart就没有必要每个文件里面都要这2个方法了。 +### File Header -### 文件头部信息 +You can add copyright,dart code, creator into here. support [Date yyyy MM-dd] format to generate time. -可以在这里添加copyright,improt dart,创建人信息等等,支持[Date yyyy MM-dd]来生成时间,Date后面为日期格式。 +### Property Readonly -比如[Date yyyy MM-dd] 会将你生成Dart代码的时间按照yyyy MM-dd的格式生成对应时间 +none,final options are provided. +### Nullable -### 属性访问器类型 +You can set nullable if you are enable null-saftey. -点击格式化之后,右边会显示可视化的json类结构,在右边一列,就是属性访问器类型设置 +## Localizations -![](https://github.com/fluttercandies/JsonToDart/blob/master/Image/属性访问器.png) +zh_hans,zh_hant and en are support. -选项:默认,Final,Get,GetSet +## Edit Class Info -顶部设置修改,下面子项都会修改。你也可以单独对某个属性进行设置。 + Dart class structure are shown at right. -## 修改json类信息 +First column is the key in Json. -点击格式化之后,右边会显示可视化的json类结构。 +Second column is Property type or Class name. Yellow background will show if it is Class. -第一列为在json中对应的key +Third column is property name. -第二列为属性类型/类的名字。如果是类名,会用黄色背景提示 +It will show red background if something is empty. -第三列是属性的名字 +## Generate -输入选项如果为空,会报红提示 +Click generate button, Dart code will generate at left side. Dart code will set into the clipboard. -## 生成Dart -做好设置之后,点击生成Dart按钮,左边就会生成你想要的Dart代码,并且提示“Dart生成成功,已复制到剪切板”,可以直接复制到你的Dart文件里面