{"id":26022371,"url":"https://github.com/debuggerx01/JSONFormat4Flutter","last_synced_at":"2025-03-06T09:55:07.629Z","repository":{"id":52913716,"uuid":"124047980","full_name":"debuggerx01/JSONFormat4Flutter","owner":"debuggerx01","description":"受zzz40500/GsonFormat启发，将JSONObject格式的String解析成dart语言的实体类","archived":false,"fork":false,"pushed_at":"2021-04-23T12:14:21.000Z","size":17361,"stargazers_count":434,"open_issues_count":7,"forks_count":57,"subscribers_count":7,"default_branch":"master","last_synced_at":"2024-05-03T03:40:08.600Z","etag":null,"topics":["dart","flutter","gson","json"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/debuggerx01.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-03-06T08:43:37.000Z","updated_at":"2023-11-21T06:23:59.000Z","dependencies_parsed_at":"2022-08-23T11:51:22.112Z","dependency_job_id":null,"html_url":"https://github.com/debuggerx01/JSONFormat4Flutter","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debuggerx01%2FJSONFormat4Flutter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debuggerx01%2FJSONFormat4Flutter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debuggerx01%2FJSONFormat4Flutter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/debuggerx01%2FJSONFormat4Flutter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/debuggerx01","download_url":"https://codeload.github.com/debuggerx01/JSONFormat4Flutter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242187662,"owners_count":20086218,"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","gson","json"],"created_at":"2025-03-06T09:55:05.393Z","updated_at":"2025-03-06T09:55:07.605Z","avatar_url":"https://github.com/debuggerx01.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"# JSONFormat4Flutter\n受zzz40500/GsonFormat启发，将JSONObject格式的String解析成dart语言的实体类\n\n## 本工具已迁移至空安全(2021–3–6)\ndart 语言更新为 null-safety 语法后，本工具生成的实体类代码就无法通过静态检查，具体细节可以参考[迁移Flutter项目到空安全的血泪史——有血、有泪、有💩](http://www.debuggerx.com/2021/03/07/migrate-flutter-project-to-null-safety/)。\n\n主要的问题有：\n1. 实例的变量需要在声明时初始化，或者在类的构造方法中进行初始化；\n2. 类的工厂方法不允许返回 null；\n3. 复杂逻辑下的可达性分析和空安全类型提升并不完美(例如对数组字段生成的赋值代码，循环中的 list 对象逻辑上不会为 null，但是语法检查器还是会将其判定为不安全的)\n\n针对如上问题，本次更新做出如下修改：\n1. 所有字段的类型均设置为可空，事实上由于我们无法保证 json 字符串输入的可靠性，不管设计如何确实所有字段都是有可能为空的；\n2. 新增 `parse(jsonStr)` 静态方法，用于替代之前的工厂构造函数，推荐在项目中优先使用该方法进行解析；\n3. 将数组字段的泛型也全部设置为可空的，并通过添加 `!` 标识符解决语法检查认为数组字段可能为空不可操作的问题。\n\n除此之外，由于发现某些三方库会尝试调用对象的 `toJson()` 方法来实现打印输出或序列化，所以添加 `String toJson() =\u003e this.toString();` 的方法映射。\n\nSee More: [JSONFormat4Flutter v0.9 更新说明](https://www.debuggerx.com/2021/04/20/jsonformat4flutter-v0-9-nullsafety/)\n\n\n## 详细介绍说明(掘金)：[在Flutter开发过程中快速生成json解析模板类的工具](https://juejin.im/post/5b4e04bbe51d45198c018e6e)\n\n## 使用演示操作：\n\n![](https://github.com/debuggerx01/JSONFormat4Flutter/blob/master/Example/json.gif?raw=true)\n\n\n## 使用说明\n#### 1.界面操作 (参考录屏：[parse.gif](https://github.com/debuggerx01/JSONFormat4Flutter/blob/master/Example/parse.gif))\n1. 工具运行以后，先将复制好的json字符串粘贴到左侧文本框，然后点击'格式化'按钮；如果提示出错请检查json是否合法\n2. 格式化成功后左侧json将会按照缩进格式化显示，并且右侧表格将显示分析得出的json结构，'Fields'列显示层级和原始分析数据，'Name'列显示每个字段的名称，'Type'列用于设定字段的数据类型\n    1. 对于普通数据类型(int、 double、 boolean、 String)，Types列的类型将会自动给出，请尽量避免在上面滚动鼠标滚轮导致类型选择改变\n    2. 对于值null的字段，Types列的类型会自动设置为Object，并以黄色背景作为警告。此时如果直接生成代码也是可以使用的，只是该字段在使用时可能需要手动强转，所以建议在知晓该字段实际类型情况下尽量补全json字符串后再点击'格式化'，或者在类型下拉框中指定实际的基本数据类型\n    3. 对于自定义对象类型(或者说字典/Map)，'Fields'的对应输入框将留空并设为红色背景，需要您手动输入类型名称，并请注意：\n        1. 任意一个字段没有输入类型名时点击代码生成按钮，都将弹出警告提示并拒绝生成代码\n        2. 设置类型名时可以参考同一行'Name'栏的值进行设置以方便使用时识别字段，一般情况下推荐直接将'Name'栏内容首字母大写作为类型名\n        3. 但是需要注意，类型名不可与'Name'栏内容完全相同，且不能是dart中的关键字，否则生成的代码将包含语法错误\n        4. 一般情况下第一行的数据类型为对象且'Name'栏内容为空，设置第一列的'Types'即为生成的bean的顶级对象类名，推荐使用'该json的作用+Resp/Bean'形式进行命名以方便管理\n    4. 对于数组类型，'Types'栏将被自动设置，并且：\n        1. 数组的泛型类型取决于数组的内容的类型，也就是下一行设置的类型；当数组下一行的内容类型变化时泛型也会自动改变\n        2. 支持数组的嵌套泛型传递\n        3. 支持空数组，并且生成的代码中其泛型会被设置为dynamic\n    5. 特殊的，如果json本身的顶层级不是对象而是数组，那么需要为第一行的'Name'栏设置类型名称，获取顶层级数组数据的方式为对象bean.list\n3. 确认设置无误后，点击'生成Bean'按钮，左侧json显示栏的内容将被替换为生成的代码，可以使用鼠标键盘全选复制，或者直接点击下方的'复制'按钮，然后将代码粘贴到IDE中，完成解析流程\n\n\n#### 2.生成代码说明  (参考录屏：[use.gif](https://github.com/debuggerx01/JSONFormat4Flutter/blob/master/Example/use.gif))\n\n1. 反序列化(json字符串-\u003e对象)\n\u003cbr\u003e将生成的代码粘贴到dart源文件中后，即可以在任意地方导包使用，一般方法为(以http.get请求为例):\n    ```java\n    var response = await HTTP.get(url);\n    var resp = BeanResp(response.body);\n    ```\n    也就是说，将请求到的json内容作为参数传递给BeanResp的默认构造函数，这样生成的resp对象即是请求到内容的实体。\n    需要说明的是，默认构造既可以传入json的原始字符串，也可以传入已经用原生json.decode()方法解析过的json对象(这主要是为了照顾使用dio库进行数据请求时结果数据会被自动解析成json对象的情况)。\n    只有顶级对象拥有默认构造方法，而其他子层级对象将使用xxx.fromJson()的命名构造进行对象创建。\n\n2. 序列化(对象-\u003ejson字符串)\n\u003cbr\u003e与官方样例的处理方式不同，直接调用对象的toString()方法即可得到json字符串完成序列化操作\n\n3. 手动创建对象\n\u003cbr\u003e为了方便大部分使用场景下的便利性，bean的默认构造函数被用来实现反序列化，所以如果想要在代码中手动传参创建bean对象，可以使用xxx.fromParams()命名构造来完成。\n\n## 简易运行方式：\n在 [Release](https://github.com/debuggerx01/JSONFormat4Flutter/releases) 页面中，选择下载对应平台最新的二进制文件后——\n#### linux:\n在程序目录打开终端后执行：chmod u+x Formatter_linux \u0026\u0026 ./Formatter_linux\n#### mac：\n在程序目录打开终端后执行：chmod u+x Formatter_mac \u0026\u0026 ./Formatter_mac\n#### windows：\n直接双击运行 Formatter_win.exe\n## 源码运行（以MAC为例）\n没有python运行环境的用户需要先安装python\n\nmac中可以使用如下命令安装\n```\nbrew install python3\nbrew install pip3\n```\npip3是python3的包管理工具\n\nbrew 可以参考下面的链接\n\nhttps://brew.sh/index_zh-cn\n\n\n\n运行库的时候会可能会提示\n```\nTraceback (most recent call last):\n  File \"formater.py\", line 8, in \u003cmodule\u003e\n    from mainwindow import *\n  File \"/Users/cjl/IdeaProjects/flutter/sxw-flutter-app/JSONFormat4Flutter/mainwindow.py\", line 9, in \u003cmodule\u003e\n    from PyQt5 import QtCore, QtGui, QtWidgets\nModuleNotFoundError: No module named 'PyQt5'\n\n```\n\n这时候可以直接用\n`pip3 install PyQt5`\n`pip3 install pyperclip`\n等待安装完成\n\n``（注：brew安装最新版python3可能会出现ssl模块丢失导致pip3无法正常使用，此时也可以考虑直接在python官网下载pkg包方式安装python）``\n\n后面使用就是在命令行敲入\n`python3 formatter.py`\n\n## 已知问题\n+ mac下从文本框复制出的文字直接粘贴到 idea/android studio 中报错 \" lllegal character '65279' \"\n\n参考 [issue1](https://github.com/debuggerx01/JSONFormat4Flutter/issues/1) ，如下图，使用5.7.1及之前版本的pyqt5\n\n![](https://user-gold-cdn.xitu.io/2018/7/17/164a8c24460f41ee?w=1270\u0026h=861\u0026f=png\u0026s=174844)\n\n## build\n- Linux:\n```shell\nnuitka3 --clang --standalone --windows-disable-console --linux-onefile-icon=logo.png --output-dir=output --show-progress --plugin-enable=qt-plugins --onefile formatter.py\n```\n- Windows:\n```shell\npyinstaller -F -w -i logo.ico formatter.py\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdebuggerx01%2FJSONFormat4Flutter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdebuggerx01%2FJSONFormat4Flutter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdebuggerx01%2FJSONFormat4Flutter/lists"}