{"id":15293100,"url":"https://github.com/fluttercandies/jsontodart","last_synced_at":"2025-04-05T07:08:16.484Z","repository":{"id":40881719,"uuid":"193806649","full_name":"fluttercandies/JsonToDart","owner":"fluttercandies","description":"The tool to convert json to dart code, support Windows，Mac，Web.","archived":false,"fork":false,"pushed_at":"2024-09-10T08:36:39.000Z","size":27931,"stargazers_count":364,"open_issues_count":3,"forks_count":46,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-29T06:09:05.834Z","etag":null,"topics":["dart","flutter-mac","flutter-web","flutter-windows","json-dart","uwp"],"latest_commit_sha":null,"homepage":"","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fluttercandies.png","metadata":{"files":{"readme":"README-ZH.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"custom":"http://zmtzawqlp.gitee.io/my_images/images/qrcode.png"}},"created_at":"2019-06-26T01:19:31.000Z","updated_at":"2025-03-21T08:15:54.000Z","dependencies_parsed_at":"2023-11-06T07:25:40.358Z","dependency_job_id":"892e9df2-096c-405a-add2-0603101e8f9e","html_url":"https://github.com/fluttercandies/JsonToDart","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2FJsonToDart","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2FJsonToDart/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2FJsonToDart/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2FJsonToDart/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fluttercandies","download_url":"https://codeload.github.com/fluttercandies/JsonToDart/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247299833,"owners_count":20916190,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dart","flutter-mac","flutter-web","flutter-windows","json-dart","uwp"],"created_at":"2024-09-30T16:39:48.390Z","updated_at":"2025-04-05T07:08:16.414Z","avatar_url":"https://github.com/fluttercandies.png","language":"Dart","funding_links":["http://zmtzawqlp.gitee.io/my_images/images/qrcode.png"],"categories":[],"sub_categories":[],"readme":"![](https://github.com/fluttercandies/JsonToDart/blob/master/UWP/Assets/Wide310x150Logo.scale-400.png)\n\n功能最全面的 Json 转换 Dart 的工具，支持 Windows，Mac，Web。\n\nLanguage: [English](README.md) | 中文简体\n- [下载](#下载)\n- [使用](#使用)\n  - [格式化](#格式化)\n  - [设置](#设置)\n    - [数据保护](#数据保护)\n    - [数组保护](#数组保护)\n    - [遍历数组次数](#遍历数组次数)\n    - [属性命名](#属性命名)\n    - [属性排序](#属性排序)\n    - [添加保护方法](#添加保护方法)\n    - [空安全](#空安全)\n    - [智能可空](#智能可空)\n    - [文件头信息](#文件头信息)\n    - [属性只读](#属性只读)\n    - [可空](#可空)\n  - [多语言](#多语言)\n  - [修改类信息](#修改类信息)\n  - [生成Dart](#生成dart)\n\n# 下载\n\nGithub下载速度太慢，为了方便大家下载，特意在gitee也创建了下载地址。\n\n[Flutter for Windows](https://gitee.com/zmtzawqlp/JsonToDart/releases/)\n\n[Flutter for Macos](https://gitee.com/zmtzawqlp/JsonToDart/releases/)\n\n[Flutter for Web](https://fluttercandies.github.io/JsonToDart/)\n\n[UWP 微软商店](https://www.microsoft.com/store/apps/9NBRW9451QSR) 功能未同步，以后会替换成 [Flutter for UWP](https://github.com/flutter/flutter/issues/14967)\n\n# 使用\n\n## 格式化\n\n点击格式化按钮，将 Json 转换为右边可视化的 Dart 类结构\n\n## 设置\n### 数据保护\n\n大家一定会有被服务端坑的时候吧？ 不按规定好了的数据类型传值，导致 Json 整个解析失败。\n\n打开这个开关，就会在获取数据的时候加一层保护，代码如下\n\n```dart\nclass FFConvert {\n  FFConvert._();\n  static T? Function\u003cT extends Object?\u003e(dynamic value) convert =\n      \u003cT\u003e(dynamic value) {\n    if (value == null) {\n      return null;\n    }\n    return json.decode(value.toString()) as T?;\n  };\n}\n\nT? asT\u003cT extends Object?\u003e(dynamic value, [T? defaultValue]) {\n  if (value is T) {\n    return value;\n  }\n  try {\n    if (value != null) {\n      final String valueS = value.toString();\n      if ('' is T) {\n        return valueS as T;\n      } else if (0 is T) {\n        return int.parse(valueS) as T;\n      } else if (0.0 is T) {\n        return double.parse(valueS) as T;\n      } else if (false is T) {\n        if (valueS == '0' || valueS == '1') {\n          return (valueS == '1') as T;\n        }\n        return (valueS == 'true') as T;\n      } else {\n        return FFConvert.convert\u003cT\u003e(value);\n      }\n    }\n  } catch (e, stackTrace) {\n    log('asT\u003c$T\u003e', error: e, stackTrace: stackTrace);\n    return defaultValue;\n  }\n\n  return defaultValue;\n}\n```\n\n你也可以重写 [FFConvert.convert] 来处理特殊的情况，比如\n``` dart\n  FFConvert.convert = \u003cT extends Object?\u003e(dynamic value) {\n    if (value == null) {\n      return null;\n    }\n    final dynamic output = json.decode(value.toString());\n    if (\u003cint\u003e[] is T \u0026\u0026 output is List\u003cdynamic\u003e) {\n      return output.map\u003cint?\u003e((dynamic e) =\u003e asT\u003cint\u003e(e)).toList() as T;\n    } else if (\u003cString, String\u003e{} is T \u0026\u0026 output is Map\u003cdynamic, dynamic\u003e) {\n      return output.map\u003cString, String\u003e((dynamic key, dynamic value) =\u003e\n          MapEntry\u003cString, String\u003e(key.toString(), value.toString())) as T;\n    } else if (const TestMode() is T \u0026\u0026 output is Map\u003cdynamic, dynamic\u003e) {\n      return TestMode.fromJson(output) as T;\n    }\n\n    return json.decode(value.toString()) as T?;\n  };\n```\n\n### 数组保护\n\n在循环数组的时候，一个出错，导致 Json 整个解析失败的情况，大家遇到过吧？\n\n打开这个开关，将对每一次循环解析进行保护，代码如下\n\n```dart\nvoid tryCatch(Function f) {\n  try {\n    f?.call();\n  } catch (e, stack) {\n    debugPrint(\"$e\");\n    debugPrint(\"$stack\");\n  }\n}\n```\n\n### 遍历数组次数\n\n在服务器返回的数据中，有时候数组里面不是每一个元素都带有全部的属性，\n\n如果只检查第一个话，会存在属性丢失的情况\n\n你可以通过多次循环来避免丢失属性\n\n选项有1，20，99\n\n99就代表循环全部进行检查\n\n### 属性命名\n\n属性命名规范选项：保持原样，驼峰式命名小驼峰，帕斯卡命名大驼峰，匈牙利命名下划线\n\n[Dart 命名规范](https://dart.dev/guides/language/effective-dart/style)\n\nDart 官方推荐 驼峰式命名小驼峰\n\n### 属性排序\n\n对属性进行排序\n\n排序选项： 保持原样，升序排列，降序排序\n\n### 添加保护方法\n\n是否添加保护方法，数据保护/数组保护的方法。\n第一次使用的时候开启就可以了，你可以把方法提出去，后面生成 Dart 就没有必要每个文件里面都包含这2个方法。\n\n### 空安全\n\n打开空安全，将生成空安全代码。\n\n### 智能可空\n打开智能可空, 所有为null的字段和数组丢失属性将会自动勾选可空\n\n### 文件头信息\n\n可以在这里添加 Copyright，Improt dart，创建人信息等等，支持[Date yyyy MM-dd]来生成时间，Date 后面为日期格式。\n\n比如[Date yyyy MM-dd] 会将你生成Dart代码的时间按照 yyyy MM-dd 的格式生成对应时间\n\n### 属性只读\n\n点击格式化之后，右边会显示可视化的 Dart 类结构，在顶部会有下拉选项\n\n选项：none，final\n### 可空\n\n在空安全打开的前提，设置属性是否可以为空。\n\n## 多语言\n\n支持中文简体，中文繁体和英文。\n\n## 修改类信息\n\n点击格式化之后，右边会显示可视化的 Dart 类结构。\n\n第一列为在 Json 中对应的key\n\n第二列为属性类型/类的名字。如果是类名，会用黄色背景提示\n\n第三列是属性的名字\n\n输入项如果为空，会报红提示\n\n## 生成Dart\n\n做好设置之后，点击生成按钮，左边就会生成 Json 对于的 Dart 代码，并且提示成功，代码自动复制到剪切板。\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluttercandies%2Fjsontodart","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluttercandies%2Fjsontodart","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluttercandies%2Fjsontodart/lists"}