本地优先、最小权限的 Android JSON 查看与编辑工具
View, query and edit JSON on Android — offline by default, one permission only.
一个装在手机上的 JSON 工作台:粘贴或导入 JSON,在代码模式与表单模式之间随时切换,查路径、改值、看错误、调接口。解析、着色、搜索、编辑全部在本地完成,没有任何统计、账号或云同步;整个应用只申请 INTERNET 一个权限,且仅用于「网络请求」功能。
| 代码模式 | 表单模式 | 结构大纲 | 完整值 / 编辑 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 导入历史 | 网络请求 | 常规设置 | 主题定制 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- 双模式:代码模式基于自绘编辑器 Sora Editor,带行号、增量语法高亮、软换行、双指缩放,几 MB 文本下输入/删除同样跟手;表单模式逐层进入,每次只渲染当前层,节点多也不卡。
- 面包屑导航:
$ › store › book[2] › title每一段可点击回退;右侧显示本层节点数,一键复制当前 JSONPath。 - 结构大纲:边缘滑动或点按钮呼出,全树展开/折叠、只看容器、按名称或值过滤,点击即跳转并闪烁定位。
- JSONPath 查询:支持
$.a.b、$[0]、$..x、[*]、切片、过滤表达式;结果可逐条定位或整体复制。 - 双模式搜索:代码页高亮命中并上下跳转;表单页跨层搜索,命中后自动进入所在层。
- 值详情:完整内容可滚动、可选中,支持值内搜索、复制值、复制路径。
- 就地编辑:修改后只替换原文对应片段,代码页与表单页同步;可把值改成字符串 / 数字 / 布尔 / null / 对象 / 数组,保存前按类型校验。
- 大文本编辑:超过 4 万字符时打开临时代码编辑器(同一套高亮、行号、搜索),直接敲回车即可换行,保存时自动转义为
\n。 - 格式化:一键美化(2 空格缩进)、压缩为单行。
- 编码解码:「编码」按钮提供中文 →
\uXXXX、\uXXXX→ 中文、Base64 解码(自动忽略空白字符,兼容 URL-safe 与省略的=)、URL 百分号解码(多字节 UTF-8 一次还原,非法序列原样保留,+不当空格)。
- GET / POST,请求体原样发送,自定义任意请求头,支持粘贴 JSON 批量填头。
- 一行拆包:直接粘贴
https://…,{"method":"POST","body":"a=1","headers":{…},"charset":"gbk"}这种抓包格式,自动拆出链接、方法、请求头、请求体与编码;URL 查询参数里的逗号不会被误拆。 - 编码与转义:文本编码可选 自动 / UTF-8 / GBK / GB18030 / 自定义,同时作用于响应解码、请求体字节和 URL 转义;URL 转义可选 自动(只转中文、空格等,保留已有
%XX)、不转义、%也转义。 - UA 策略:手机 UA / 电脑 UA / 多条自定义 / 不携带;Referer 可关闭自动补全;Content-Type 可选自动、JSON、表单、纯文本、自定义或不发送。手填的请求头永远优先。
- 先看状态码与响应体,再决定是否导入到代码页;成功的请求连同方法、头、正文与策略一起进「链接历史」,点一下还原整次请求。
- 预设主题 + 自定义主色 / 背景 / 强调色,代码与表单字号独立调节,浅色深色自动适配。
- 底部按钮可排序,每个按钮支持三态:底栏 / 更多 / 隐藏;「撤销 / 重做」也在其中,无操作可退时自动压暗。
- 导入历史、链接历史各 1–100 条,可多选删除。
- 崩溃日志默认开启,记录版本、机型、堆栈与崩溃前页面,可在设置里查看、复制、分享或关闭。
- 大文件防护:16MB 文件上限、200 万字符编辑器上限、25 万节点、400 层嵌套、5000 条命中,超限给出明确提示而不是闪退。
前往 Releases 下载最新 APK:
json-viewer-1.5.4.apk— 正式版,release 签名,可直接安装(Android 7.0+,约 2.5 MB)- 安装时如提示「未知来源」,在系统设置里允许对应应用安装即可
从旧版本(
com.jsonviewer)升级的用户请注意:包名已改为com.guaner.jsonviewer,新旧版本可以共存,但本地历史与设置不会自动迁移。
环境:JDK 17、Android SDK 34(build-tools 34.0.0)、Gradle 8.2(随工程提供 wrapper)。
git clone https://github.com/zmn001125/JsonViewer.git
cd JsonViewer
./gradlew assembleDebug # app/build/outputs/apk/debug/app-debug.apk
./gradlew assembleRelease # app/build/outputs/apk/release/app-release.apk(R8 + 资源压缩)
./gradlew testDebugUnitTest # 单元测试也可以直接用 Android Studio 打开工程,等待 Sync 完成后运行。
仓库不包含任何密钥。assembleRelease 按以下顺序取签名:
- 环境变量
JSONVIEWER_KEYSTORE/JSONVIEWER_STORE_PASSWORD/JSONVIEWER_KEY_ALIAS/JSONVIEWER_KEY_PASSWORD; - 工程根目录的
release.jks(已在.gitignore中排除); - 都没有时退回 debug 签名,保证产物仍可安装。
.github/workflows/android.yml 在 push / PR 时运行单元测试并构建 debug 与 release 包,产物上传为 artifact;推送 v* 标签时会自动创建 GitHub Release 并附上 APK。
app/src/main/java/com/guaner/jsonviewer/
├── MainActivity.kt # 主界面:模式切换、解析调度、搜索定位、导入分享
├── JsonViewerApp.kt # 全局初始化(设置、主题、历史、崩溃日志)
├── json/ # 解析、建树、序列化、JSONPath、错误定位、限额
├── net/ # HttpURLConnection 引擎、请求头 JSON 解析
├── data/ # 设置、导入历史、链接历史、UA 配置、会话存储
├── theme/ # 主题模型、配色推导、预设与自定义主题
├── editor/ # 代码编辑器:JSON 着色语言、主题→配色映射
├── text/ # 超长行安全折行、输入法提交与选区处理、行首索引
├── crash/ # 崩溃日志落盘与解析
└── ui/ # 编辑器、树、大纲、值面板、网络面板、设置页
app/src/test/ # 纯 JVM 单元测试(解析 / 路径 / 序列化 / 设置)
docs/screenshots/ # README 截图
技术栈:Kotlin + ViewBinding + Material 3,代码编辑用 Sora Editor,解析用 Jackson Core 流式 API(异常自带字符偏移,便于换算行列),查询用 Jayway JsonPath。没有引入图片加载、数据库或网络库,网络请求直接用 HttpURLConnection。
| 权限 | 用途 |
|---|---|
INTERNET |
仅「网络请求」面板发起 HTTP/HTTPS 请求 |
- 导入文件走系统文档选择器(SAF),保存与分享走
FileProvider,都不需要存储权限。 - 历史、设置、崩溃日志只存在应用私有目录,卸载即清除。
- 无广告、无统计 SDK、无账号体系,不会上传任何内容。
- 明文 HTTP:网络面板允许
http://(network_security_config.xml中放开cleartextTrafficPermitted),方便调试内网与老接口;HTTPS 仍走系统 CA 校验。 - 混淆:release 开启 R8 与资源压缩,json-path / Jackson 已配置 keep 规则。
- 测试:单元测试覆盖解析器、路径引擎、序列化、限额、设置与主题编解码等纯逻辑模块,不依赖设备与网络。
- 1.5.4 — 底栏「转义」升级为「编码」,除中文 ↔
\uXXXX外新增 Base64 解码与 URL 百分号解码;Base64 自动忽略首尾及中间的空白,兼容 URL-safe 字符和省略的=填充 - 1.5.3 — 修复用输入法粘贴大文本卡死崩溃。输入法粘贴与软件粘贴按钮走的是两条不同的路,前者会把一整行几十万字符直接塞进编辑器,主线程当场被断行计算堵死,事后补救根本来不及。现在文本进入编辑器之前先折行。顺带补上两条漏网路径:长按菜单里的「粘贴」,以及输入法的分批粘贴
- 1.5.2 — 修复大文本下用输入法移动光标卡顿、不跟手、偶发无反应。四处各自的原因:回给输入法的上下文文本没有上限(默认可达 50 万字符,现封顶 512);每次移动光标都走了最重的那条路径(连带整篇重排、缓存作废);自动折行有「文档不足 32KB 就跳过」的门槛,漏掉了压缩成一行的小体积 JSON;组词状态会卡住导致左右键被放行给候选区
- 1.5.1 — 修复粘贴非 JSON 文本后整篇文字看不见(默认文字样式用错了颜色槽位,字被透明色画没);输入法左右移动光标不再变成「选中一个字」;折行后错误位置、搜索命中、跳转高亮会重新结算;折行的安全阀改为字符等价校验,非 JSON 的大段文本同样能折行;值编辑面板不再自动折行
- 1.5.0 — JSON 解析失败时关闭语法着色,改错时更跟手;修复折行在引号不平衡时会把真实换行插进字符串里面、导致内容报废的问题(加了三道保险);支持用输入法方向键移动光标
- 1.4.9 — 修复 1.4.8 引入的编辑错乱:删一个字符后内容错乱、光标错位、文字变背景色;删除不再被误判为需要折行;修复输入法左右移动光标失效
- 1.4.8 — 修复极长单行导致自动换行卡死:先在引号之外的结构符后把超长行折短,再交给官方换行
- 1.4.7 — 自动换行策略交回编辑器自身(之前每次输入都重建布局,那期间完全没法编辑);压缩成一行的文本不再逐词着色
- 1.4.6 — 修复粘贴进来的长文本不会自动换行;修复大文本编辑卡顿;拖滚动条不再误呼出大纲
- 1.4.5 — 大纲跳转高亮改用与语法着色、搜索命中相同的色块通道
- 1.4.4 — 大纲跳转改为双层色块:整行浅底,字段名深底
- 1.4.3 — 修复大纲跳转后字段名没有深色高亮
- 1.4.2 — 底栏新增撤销 / 重做,可隐藏、可排序;值编辑弹窗支持搜索与替换;开关按开 / 关 / 禁用三态配色
- 1.4.1 — 代码搜索支持正则、区分大小写与替换,超大文本不卡主线程
- 1.4 — 代码编辑换用 Sora Editor,几 MB 文本打字删除滚动都跟手,三处编辑器统一
- 1.3.1 — 修复「提示已恢复但内容为空」
- 1.3 — 优化超大文本编辑手感;新增启动保护,异常退出后不再自动恢复上次内容
- 1.2 — 许可证由 MIT 变更为 GPL-3.0
- 1.1 — 网络面板支持粘贴「链接,{配置}」自动拆分;新增文本编码与 URL 转义选项
- 1.0 — 首个开源版本
- Sora Editor — 代码编辑器的排版、行号、选区、撤销栈与自绘渲染(LGPL-2.1)
- Jackson Core — 流式 JSON 解析
- Jayway JsonPath — JSONPath 查询
- Material Components for Android
GNU General Public License v3.0 © 2026 zmn001125
这是一份强 copyleft 协议,用一句话说清:
| 你的用法 | 是否需要开源 |
|---|---|
| 自己用、内部用,不对外分发 | 不需要,随便改 |
| 改了之后分发 APK、上架应用商店、随产品交付给客户 | 必须以同样协议开放修改后的完整源码 |
| 原样分发(不改) | 需要保留本协议与版权声明,并附带源码获取方式 |
换言之:可以免费用、免费改、免费商用,但不能拿去做闭源分发。 分发时需提供对应源码(本仓库地址即可),并保留原作者版权声明。
关于历史版本:v1.0 与 v1.1 曾以 MIT 协议发布,已获得的授权不可撤销,仍按 MIT 处理。GPL-3.0 自 v1.2 起生效。
第三方依赖仍遵循各自协议:Sora Editor(LGPL-2.1)、Jackson Core(Apache-2.0)、Jayway JsonPath(Apache-2.0)、AndroidX / Material Components(Apache-2.0),均与 GPL-3.0 兼容。
关于 Sora Editor:它以 LGPL-2.1 发布并以未修改的二进制形式(Maven 依赖)链接进本应用。GPL-3.0 允许这种链接方式;如果你 fork 本仓库并修改了 Sora Editor 自身源码,需要按 LGPL-2.1 开放那部分改动。







