Oh MyUtils

JSON转Go Struct - Go结构体类型生成器 在线

粘贴JSON即可立即生成Go struct定义,包含正确命名、json标签和类型推断 — 100%浏览器处理,无需服务器。

根名称
嵌套
缩进
空类型
整数类型
标志
JSON输入
Go Struct输出
 

常见问题

什么是JSON转Go struct转换器?

JSON转Go struct转换器是一个从JSON数据自动生成Go struct类型定义的工具。无需手动编写包含字段名、类型和json struct标签的struct定义,只需粘贴一个JSON示例对象,工具就会为每个字段推断正确的Go类型。它将嵌套对象处理为独立的struct,数组处理为切片,并生成适当的`json:"field_name"` struct标签用于序列化和反序列化。

如何从JSON生成Go structs?

只需将JSON数据粘贴到左侧的输入字段中。工具将立即在右侧的输出面板中生成Go struct定义。您可以通过设置根struct名称、切换struct标签上的omitempty、选择内联或分离嵌套struct、以及为可空字段启用指针类型来自定义输出。

Go struct标签中的omitempty有什么作用?

json struct标签中的`omitempty`选项告诉Go的JSON编码器,如果字段具有零值(空字符串、0、false、nil指针、空切片或空映射),则从输出中省略该字段。这对于只想发送已明确设置的字段的API请求非常有用。

应该使用内联还是分离struct?

分离struct(默认)为每个嵌套对象创建命名类型,使其在整个代码库中可重用。内联struct直接嵌入类型定义,更紧凑但不能重用。生产代码使用分离struct,快速原型设计使用内联struct。

使用此工具时我的JSON数据安全吗?

是的,完全安全。此工具使用客户端JavaScript在您的浏览器中处理所有内容。您的JSON数据永远不会离开您的计算机——没有服务器上传、没有API调用、没有数据存储。

工具如何处理Go命名约定?

工具遵循Effective Go的Go官方命名约定。JSON字段名转换为PascalCase用于导出的struct字段(例如,'user_name'变为'UserName')。常见缩写正确大写:'id'变为'ID','url'变为'URL','http'变为'HTTP'。

何时应该为可空字段使用指针类型?

当您需要区分零值和缺失/null值时使用指针类型。使用指针类型(*int),缺失的字段变为nil。当使用null表示可选或缺失数据的API时,启用「指针类型」选项。

代码示例

// JSON to Go struct generator
function jsonToGoStruct(json, rootName = 'AutoGenerated') {
  const structs = [];
  const abbreviations = new Set([
    'id', 'url', 'http', 'api', 'html', 'json', 'xml', 'sql',
    'ssh', 'tcp', 'udp', 'ip', 'dns', 'uid', 'uuid', 'cpu',
  ]);

  function toGoName(key) {
    return key.split(/[-_\s]+/).map(word => {
      if (abbreviations.has(word.toLowerCase())) {
        return word.toUpperCase();
      }
      return word.charAt(0).toUpperCase() + word.slice(1);
    }).join('');
  }

  function inferType(value, name) {
    if (value === null) return 'interface{}';
    if (typeof value === 'boolean') return 'bool';
    if (typeof value === 'number') {
      return Number.isInteger(value) ? 'int' : 'float64';
    }
    if (typeof value === 'string') return 'string';
    if (Array.isArray(value)) {
      if (value.length === 0) return '[]interface{}';
      return '[]' + inferType(value[0], name + 'Item');
    }
    if (typeof value === 'object') {
      const structName = toGoName(name);
      const fields = Object.entries(value).map(([key, val]) => {
        const goType = inferType(val, key);
        const goName = toGoName(key);
        return `\t${goName} ${goType} \`json:"${key}"\``;
      });
      structs.push(`type ${structName} struct {\n${fields.join('\n')}\n}`);
      return structName;
    }
    return 'interface{}';
  }

  const parsed = JSON.parse(json);
  inferType(parsed, rootName);
  return structs.reverse().join('\n\n');
}

// Example usage
const json = '{"user_id": 1, "user_name": "alice", "address": {"city": "NYC"}}';
console.log(jsonToGoStruct(json));
// Output:
// type Address struct {
// 	City string `json:"city"`
// }
//
// type AutoGenerated struct {
// 	UserID   int     `json:"user_id"`
// 	UserName string  `json:"user_name"`
// 	Address  Address `json:"address"`
// }

相关工具