开发者工具 · JSON / 数据格式

JSON 转多语言

Dart/Kotlin/Rust/Swift/C#/PHP

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 58 次使用
JSON 输入数据
Dart 类型推断 · 嵌套 · 序列化
目标语言代码将在这里呈现 —— 点「示例」试试
就绪 · 左侧粘贴 JSON,自动推断类型并生成目标语言代码,全程本地处理
第一节

关于本工具

About

后端接口返回的 JSON 结构里,字段名是 snake_case,前端却要用 camelCase;Android 用 Kotlin,iOS 用 Swift,数据模型得各写一份。把 JSON 粘贴进来,选目标语言(Dart/Kotlin/Rust/Swift/C#/PHP),它直接生成对应的类型定义代码,连 null 安全、可选类型都一并处理。转换在浏览器本地完成,JSON 不会发到任何服务器。

使用场景

Flutter 多语言文件

Flutter 项目要求 .arb 格式的本地化文件,键值对结构严格。手动为 50 个英文键写 Dart 版中文翻译时,漏了一个逗号或引号就会导致编译失败。本工具将 JSON 结构原样转换为 Dart Map 常量,保留嵌套层级和注释格式,粘贴后无需手动调整缩进即可直接放入 l10n 目录。

Kotlin 数据类迁移

旧项目用 Java 的 Gson 解析 JSON,迁移到 Kotlin 后需要将 JSON 字段映射为 data class 属性。手动写 30 个字段的 @SerializedName 注解和默认值耗时且容易漏掉 nullable 类型。本工具将 JSON 键自动转为 Kotlin 的驼峰命名属性,并为每个字段标注 ? 或 !!,减少编译期空安全报错。

Rust 配置反序列化

游戏服务器配置文件是 JSON 格式,Rust 端需要 serde 的 #[derive(Deserialize)] 结构体。团队里有人把字段名写成了 snake_case 但 JSON 里是 camelCase,运行时直接 panic。本工具在转换时自动添加 #[serde(rename_all = "camelCase")] 属性,并生成完整的测试桩代码,避免线上配置加载失败。

Swift 模型层重构

iOS 端将 Objective-C 的 JSON 解析迁移到 Swift 的 Codable 协议,需要手动写 40 个 struct 并确保 CodingKeys 枚举与 JSON 键完全一致。遗漏一个键会导致整个解析失败。本工具将 JSON 的每一层嵌套自动展开为对应的 Swift struct,并生成完整的 CodingKeys 映射,粘贴后直接通过编译。

C# 模型类批量生成

Unity 项目接入第三方 API,返回的 JSON 有 15 个嵌套对象和数组。手动写 C# 类时,数组类型容易写错 List<T> 或 T[],反序列化时抛出空引用。本工具将 JSON 数组自动识别为 List<T>,并为每个属性加上 [JsonProperty] 特性,粘贴到项目后可直接用 Newtonsoft.Json 或 System.Text.Json 解析。

PHP 数组配置转换

Laravel 项目的 config 文件需要从 JSON 格式迁移到 PHP 数组格式。手工替换时容易把 true/false 写成字符串,导致逻辑判断出错。本工具将 JSON 的布尔值、数字、null 原样转为 PHP 的 true/false/null 字面量,并保留数组索引结构,粘贴到 config 目录后无需再跑 artisan config:cache 排查类型错误。

第二节

使用指南

Getting Started

使用步骤

  1. 1在输入区粘贴 JSON 字符串,左侧实时显示格式化后的树状结构,无语法错误时无红色标记
  2. 2从「目标语言」下拉框勾选所需语言(Dart/Kotlin/Rust/Swift/C#/PHP),支持多选,选中项高亮
  3. 3点击「生成」按钮,右侧结果区立即输出对应语言的模型类代码,每段代码顶部标注语言名称
  4. 4点任意代码块右上角的复制图标,该段代码即写入剪贴板,按钮短暂显示「已复制」反馈

输入输出示例

输入输出说明
{"name": "张三", "age": 30}// Dart Map<String, dynamic> user = { 'name': '张三', 'age': 30 }; // Kotlin val user = mapOf( "name" to "张三", "age" to 30 ) // Rust use std::collections::HashMap; let mut user = HashMap::new(); user.insert("name", "张三"); user.insert("age", 30); // Swift let user: [String: Any] = [ "name": "张三", "age": 30 ] // C# var user = new Dictionary<string, object>() { { "name", "张三" }, { "age", 30 } }; // PHP $user = [ 'name' => '张三', 'age' => 30 ];常规:最简单的键值对 JSON,验证基本类型(字符串、数字)在六种语言中的映射一致性。
[1, 2, 3]// Dart List<int> list = [1, 2, 3]; // Kotlin val list = listOf(1, 2, 3) // Rust let list = vec![1, 2, 3]; // Swift let list = [1, 2, 3] // C# var list = new List<int> { 1, 2, 3 }; // PHP $list = [1, 2, 3];常规:纯数组 JSON,验证列表类型在六种语言中的声明方式(如 Rust 用 vec!,Kotlin 用 listOf)。
null// Dart null // Kotlin null // Rust None // Swift nil // C# null // PHP null边界:JSON 的 null 值,验证各语言对空值的表达差异(Rust 用 None,Swift 用 nil,其余用 null)。
{"nested": {"a": 1, "b": [true, false]}}// Dart Map<String, dynamic> nested = { 'nested': { 'a': 1, 'b': [true, false] } }; // Kotlin val nested = mapOf( "nested" to mapOf( "a" to 1, "b" to listOf(true, false) ) ) // Rust use std::collections::HashMap; let mut nested = HashMap::new(); let mut inner = HashMap::new(); inner.insert("a", 1); inner.insert("b", vec![true, false]); nested.insert("nested", inner); // Swift let nested: [String: Any] = [ "nested": [ "a": 1, "b": [true, false] ] ] // C# var nested = new Dictionary<string, object>() { { "nested", new Dictionary<string, object>() { { "a", 1 }, { "b", new List<object> { true, false } } }} }; // PHP $nested = [ 'nested' => [ 'a' => 1, 'b' => [true, false] ] ];边界:嵌套 JSON(对象内嵌对象和数组),验证递归转换能力,尤其是 C# 和 Kotlin 的嵌套 Dictionary 声明。
{"key with spaces": "value", "special!@#": 123}// Dart Map<String, dynamic> data = { 'key with spaces': 'value', 'special!@#': 123 }; // Kotlin val data = mapOf( "key with spaces" to "value", "special!@#" to 123 ) // Rust use std::collections::HashMap; let mut data = HashMap::new(); data.insert("key with spaces", "value"); data.insert("special!@#", 123); // Swift let data: [String: Any] = [ "key with spaces": "value", "special!@#": 123 ] // C# var data = new Dictionary<string, object>() { { "key with spaces", "value" }, { "special!@#", 123 } }; // PHP $data = [ 'key with spaces' => 'value', 'special!@#' => 123 ];易错:键名含空格和特殊字符,验证工具是否保留原键名(不转义、不报错),所有语言均用字符串键。
{"empty": ""}// Dart Map<String, dynamic> data = { 'empty': '' }; // Kotlin val data = mapOf( "empty" to "" ) // Rust use std::collections::HashMap; let mut data = HashMap::new(); data.insert("empty", ""); // Swift let data: [String: Any] = [ "empty": "" ] // C# var data = new Dictionary<string, object>() { { "empty", "" } }; // PHP $data = [ 'empty' => '' ];易错:空字符串值,验证工具不会将其错误转换为 null 或忽略,所有语言均保留空字符串。

常见错误对照

1.JSON 键名未用双引号

✗ 错误{ name: "张三", age: 25 }
✓ 修复{ "name": "张三", "age": 25 }

JSON 规范(RFC 8259)要求所有键名必须用双引号包裹。无引号或单引号均非法,解析器会直接报错。

2.字符串值用了单引号

✗ 错误{ "name": '张三' }
✓ 修复{ "name": "张三" }

JSON 只允许双引号包裹字符串值。单引号是 JavaScript 对象字面量语法,不是 JSON 标准。

3.末尾多余逗号

✗ 错误{ "name": "张三", "age": 25, }
✓ 修复{ "name": "张三", "age": 25 }

JSON 不允许数组或对象末尾出现逗号。很多编辑器会高亮提示,但直接粘贴到工具中会导致解析失败。

4.数字前补零(如版本号)

✗ 错误{"version": "01.2.3"} 或 {"version": 01.2.3}
✓ 修复{"version": "1.2.3"}

JSON 数字不允许前导零(除非是 0 本身)。版本号这类应作为字符串处理,否则解析器会报语法错误。

5.布尔值写成小写或字符串

✗ 错误{ "active": true } 误写成 { "active": "true" } 或 { "active": True }
✓ 修复{ "active": true }

JSON 布尔值必须是小写 true/false。大写 True/False 或字符串 "true" 均不符合规范,各语言解析器行为不一致。

6.嵌套层级过深导致内存溢出

✗ 错误构造 1000 层嵌套的 JSON 对象
✓ 修复保持嵌套层级在 10 层以内,或使用扁平化结构

多数 JSON 解析器默认递归深度限制为 512 或 1024。超深层级会导致栈溢出或内存耗尽,尤其在浏览器端解析时。

7.未转义字符串中的特殊字符

✗ 错误{"path": "C:\Users\test"}
✓ 修复{"path": "C:\\Users\\test"}

JSON 字符串中的反斜杠必须转义为 \\。Windows 路径、正则表达式等含反斜杠的内容最易遗漏转义。

8.混用注释(// 或 /* */)

✗ 错误{ // 用户信息 "name": "张三" }
✓ 修复去除所有注释,或使用 JSONC(带注释的 JSON)格式

JSON 标准不支持注释。很多开发者习惯在配置文件中加注释,但标准 JSON 解析器会直接报错。

9.将函数或 undefined 写入 JSON

✗ 错误{"callback": function(){}, "data": undefined}
✓ 修复仅保留 JSON 支持的数据类型:字符串、数字、布尔、数组、对象、null

JSON 是纯数据交换格式,不支持函数、undefined、Symbol 等 JavaScript 特有类型。序列化时这些值会被忽略或报错。

第三节

工作原理

How It Works

核心公式

T = { key: value } → { lang: { key: translated_value } }

变量说明

  • keyJSON 中的原始键名
  • valueJSON 中的原始字符串值
  • lang目标语言代码,如 zh、en
  • translated_value对应语言的翻译结果

示例

输入 JSON:{ "greeting": "Hello", "farewell": "Goodbye" },目标语言 zh。转换后输出:{ "zh": { "greeting": "你好", "farewell": "再见" } }。每个原始键值对映射到 lang 对象下,键不变,值替换为翻译文本。

JSON 输入解析键值结构识别嵌套层级逐键生成目标语言Dart / Kotlin / Rust …输出校验 JSON 合法性非法则提示错误保留原始键名值转为语言类型
用户输入 / 校验 本地处理 输出结果
第五节

常见问题

Q & A
这个工具能转成哪些语言,我用的 Go 语言支持吗?

本工具支持将 JSON 结构转换为 Dart、Kotlin、Rust、Swift、C# 和 PHP 这六种语言的类型定义或类代码。目前暂不支持 Go、Java、Python 等语言。如果项目中主要用 Go,建议直接使用 Go 自带的 json.Unmarshal 或第三方库 like ffjson 来生成结构体。

我贴了一个很深的嵌套 JSON,转换后会不会把代码撑爆或者卡死?

本工具完全在浏览器本地运行(FE 实现),没有上传服务器,所以不涉及服务器端爆炸问题。但浏览器本身有内存限制:如果 JSON 超过 5MB 或嵌套层数超过 20 层,转换过程可能会变慢甚至浏览器标签页卡顿。建议先拆成小块转换,或使用桌面端 IDE 插件处理超大文件。

为什么我 JSON 里的字段名是下划线风格,转成 C# 后变成了驼峰?

这是工具默认的命名规范:C# 和 Java 系语言通常使用 PascalCase(首字母大写驼峰),而 Dart、Swift 等使用 camelCase。工具在转换时会自动将下划线命名转为对应语言的惯用风格。如果你需要保留原始字段名,可以在输出结果中手动修改类属性上的 JsonProperty 特性标签。

JSON 里有一个字段值是 null,转成 Rust 后怎么处理?

Rust 的 serde 库要求字段类型必须明确。当 JSON 中某个字段值为 null 时,工具会将其生成为 Option<T> 类型,比如 Option<String> 或 Option<i32>。这样在反序列化时遇到 null 不会报错,而是得到 None。如果确定该字段永远不会是 null,可以在转换前将 JSON 中的 null 替换为默认值(如空字符串或 0)。

我有一段 JSON 数组,里面每个元素结构不一样,能转吗?

JSON 数组要求所有元素类型一致才能正确转换为强类型语言。如果数组内元素结构不同(如第一个是对象、第二个是字符串),工具会尝试选择最常见的结构作为基类,但可能丢失部分字段。建议手动将异构数组拆成多个独立字段或使用 Dictionary<string, object> 类型来接收。

转换后生成的类代码,我直接复制到项目里编译报错怎么办?

常见原因有三个:一是生成的类名可能与项目现有类名冲突,建议粘贴前先检查命名空间;二是工具生成的类不包含 using 语句(如 C# 需要 using System.Collections.Generic),需要手动添加;三是 JSON 中如果包含特殊字符(如 $ 或 #),工具会转义为合法标识符,但需确认是否符合项目命名规范。

这个工具和网站上的其他 JSON 工具有什么区别?

本工具专注于「JSON 结构 → 多语言类代码」的单向转换,不处理 JSON 格式化、压缩、校验或 XML 互转。其他工具如 JSON 编辑器或 JSON 对比工具侧重数据查看与编辑。如果你只是想把一段 JSON 变成 Dart 或 Kotlin 的实体类,这个工具最直接;如果需要先验证 JSON 合法性,建议先用 JSON 校验工具再过来转换。

我手机浏览器能不能用,会不会上传数据到服务器?

可以,本工具完全在浏览器本地执行(FE 实现),所有 JSON 数据仅在你的设备内存中处理,不会上传到任何服务器。即使手机浏览器性能较弱,处理几百 KB 的 JSON 文件也基本流畅。不过注意,如果数据量过大(超过 2MB),建议使用电脑端操作以避免浏览器崩溃。

为什么我转成 Swift 后,生成的类里没有 Codable 协议?

当前版本生成的 Swift 代码是纯结构体定义,不自动添加 Codable 或 Decodable 协议。这是为了让代码更简洁,避免强制依赖。你可以在生成的结构体后手动添加 : Codable,并在类内部实现 CodingKeys 枚举(如果字段名与 JSON key 不一致)。后续版本可能会增加「包含 Codable」的选项开关。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭