logo
GeekFormat

Dán JSON vào bên trái, và định nghĩa kiểu struct Go sẵn sàng sử dụng trực tiếp trong dự án Go sẽ tự động được tạo ra ở bên phải. Xử lý cục bộ thuần túy trên trình duyệt, không cần đăng ký hay tải lên.

Đề xuất Liên quan

Giới thiệu về JSON sang Go: Biến JSON thành struct kiểu mạnh của Go

JSON sang Go là quá trình tự động chuyển đổi dữ liệu định dạng JSON thành định nghĩa kiểu struct của ngôn ngữ Go. JSON là định dạng trao đổi dữ liệu phổ biến nhất trong REST API, tệp cấu hình, hàng đợi tin nhắn và nhật ký, trong khi Go là ngôn ngữ kiểu mạnh; trong quá trình phát triển, cấu trúc động của JSON thường cần ánh xạ thành struct trước khi giải tuần tự hóa với encoding/json. Viết struct thủ công, đặc biệt là các đối tượng lồng, dễ dẫn đến thiếu trường hoặc sai kiểu; công cụ này nhằm mục đích tự động hóa công việc lặp lại.

Struct của Go là kiểu dữ liệu tổng hợp, được khai báo bằng `type Name struct { ... }`. Mỗi trường bao gồm tên và kiểu; tên trường phải bắt đầu bằng chữ hoa để các gói khác có thể truy cập, gọi là 'định danh xuất'. Công cụ tự động chuyển đổi tên trường JSON thành tên trường xuất PascalCase, ví dụ `user_name` ánh xạ thành `UserName`, với khóa gốc được bảo toàn trong thẻ json.

Chuyển đổi cốt lõi của công cụ này được thực hiện bởi Web Worker jsonFormat trong trình duyệt, gọi trình kết xuất Go của quicktype-core với các tùy chọn `just-types` và `no-comments`. Toàn bộ quy trình không phụ thuộc vào dịch vụ phụ trợ: JSON đầu vào được phân tích cục bộ, kiểu được suy luận, mã Go được tạo, cuối cùng được trình bày trong trình chỉnh sửa bên phải.

Suy luận kiểu tuân theo ánh xạ JSON sang Go thông thường: chuỗi ánh xạ thành `string`, boolean thành `bool`, số nguyên thành `int64`, số thực thành `float64`, mảng thành slice `[]T`, đối tượng thành struct độc lập, `null` thành `interface{}`. Các đối tượng lồng được xử lý đệ quy, duy trì phân cấp rõ ràng.

So với viết thủ công, mã do công cụ tạo là 'bản nháp đầu tiên có thể chạy được'. Các nhà phát triển thường chỉ cần tinh chỉnh tên kiểu gốc, tên gói, độ chính xác kiểu trường (ví dụ int64 thành int) và có sử dụng kiểu con trỏ hay không, trước khi đưa vào dự án Go thực tế. Kết hợp với sao chép một cú nhấp và tải model.go, công việc lặp lại trong giai đoạn tích hợp và mô hình hóa được giảm đáng kể.

Trường hợp sử dụng

  • Phát triển backend Go chuyển đổi JSON phản hồi REST API thành struct, liên kết trực tiếp với tham số trình xử lý Gin/Echo/Fiber bằng json.Unmarshal
  • Trong quá trình tích hợp frontend-backend, lấy JSON phản hồi mẫu từ Postman, nhanh chóng tạo mô hình Go để giảm gõ trường thủ công
  • Khi tích hợp cuộc gọi lại Webhook của bên thứ ba, chuyển đổi JSON payload thành struct Go để truy cập và xác thực cấp trường thuận tiện
  • Chuyển đổi tệp cấu hình JSON từ Viper/Consul/Nacos thành các kiểu Go, thay thế truy cập map[string]interface{} kiểu yếu
  • Các nhóm microservice thống nhất cấu trúc yêu cầu/phản hồi cho giao diện gRPC/HTTP, chuyển đổi JSON mẫu thành các kiểu Go chia sẻ
  • Kỹ sư kiểm thử chuyển đổi JSON fixture thành struct Go, sử dụng với testify cho kiểm thử theo hướng khẳng định
  • DevOps phân tích các dòng nhật ký JSON được thu thập bởi ELK/Fluentd, tạo struct cho phân tích cấu trúc bằng chương trình Go
  • Sau khi trình thu thập dữ liệu cào dữ liệu JSON, chuyển đổi thành struct Go, làm việc với gorm/gen hoặc ent để tạo mô hình cơ sở dữ liệu
  • Dữ liệu đo từ xa JSON được báo cáo bởi thiết bị IoT chuyển đổi thành struct Go, giải tuần tự hóa và lọc trong chương trình cổng biên
  • Chuyển đổi thông báo JSON được tiêu thụ từ Kafka/NATS/RabbitMQ thành các kiểu Go, cho triển khai consumer theo hướng sự kiện
  • Nhà phát triển SDK chuyển đổi JSON phản hồi mẫu của máy chủ thành struct Go, viết vào gói types của thư viện client để người dùng tham khảo
  • Chuyển đổi JSON mẫu từ tài liệu Swagger/OpenAPI thành struct Go làm ví dụ mã tài liệu giao diện
  • Sinh viên hoặc giảng viên chuyển đổi JSON mẫu thành struct trong các khóa học Go, trình bày hệ thống kiểu của Go và cách sử dụng thẻ json
  • Các tập lệnh di chuyển dữ liệu chuyển đổi các dòng JSON được xuất từ MySQL/PostgreSQL thành struct Go, cho ánh xạ trường và xác thực kiểu
  • JSON cấu hình CI/CD chuyển đổi thành struct Go, thuận tiện đọc cấu hình kiểu mạnh trong các công cụ đường ống viết bằng Go
  • Dự án cũ cấu trúc lại mã đọc JSON dựa trên map động thành truy cập dựa trên struct kiểu mạnh

Cách Sử dụng

  1. Dán nội dung JSON trong trình chỉnh sửa bên trái, hoặc kéo thả tải lên tệp .json/.txt, hoặc nhấp 'Mẫu' để tải dữ liệu tích hợp.
  2. Chờ khoảng 400ms, công cụ sẽ tự động chuyển đổi và hiển thị mã struct Go đã tạo ở bên phải.
  3. Nếu JSON có lỗi, nhấp nút 'Sửa JSON' để tự động sửa các lỗi định dạng phổ biến sau đó tiếp tục tạo.
  4. Kiểm tra đầu ra bên phải, nhấp 'Sao chép' để dán vào dự án Go, hoặc nhấp 'Tải xuống' để lưu dưới dạng tệp model.go.

Tính năng

  • Tạo struct Go cục bộ trên trình duyệt: Phân tích JSON và tạo mã Go hoàn thành trong trình duyệt, dữ liệu thô không tải lên máy chủ
  • Tự động chuyển đổi chống rung 400ms: Không cần nhấp thủ công sau khi dán hay sửa đổi, mã Go có thể sao chép xuất ra thời gian thực ở bên phải
  • Suy luận kiểu thông minh: chuỗi ánh xạ thành string, boolean thành bool, số nguyên thành int64, số thực thành float64, mảng thành slice, đối tượng thành struct
  • Đối tượng lồng tự động mở rộng: Đệ quy tạo các kiểu struct độc lập, duy trì phân cấp JSON rõ ràng
  • Tự động tạo thẻ json: Các trường đi kèm thẻ `json:"tên_trường_gốc"`, sẵn sàng sử dụng với encoding/json
  • Sửa lỗi JSON một cú nhấp: Tự động xử lý dấu phẩy đuôi, dấu nháy đơn, thiếu dấu nháy và các lỗi định dạng phổ biến khác, tiếp tục tạo sau khi sửa
  • Hỗ trợ đầu vào dán/tải lên/mẫu: Kéo thả tải lên tệp .json/.txt, hoặc tải mẫu tích hợp sẵn
  • Sao chép và tải xuống một cú nhấp: Sao chép toàn bộ mã Go vào bộ nhớ tạm, hoặc tải xuống dưới dạng tệp model.go trực tiếp vào dự án
  • Lịch sử đầu vào localStorage: Tự động lưu các đầu vào gần đây, khôi phục nhanh sau khi làm mới hay vô tình đóng trang
  • Trình chỉnh sửa chia màn hình đáp ứng: Chiều rộng bảng điều khiển trái/phải có thể điều chỉnh, xem đầu vào/đầu ra thoải mái trên máy tính để bàn và di động

Ví dụ mã

Giải tuần tự hóa JSON với struct đã tạo

go

Sau khi sao chép struct đã tạo vào dự án, trực tiếp giải tuần tự hóa phản hồi API với encoding/json.

package main

import (
    "encoding/json"
    "fmt"
)

// 以下代码由 GeekFormat JSON 转 Go 工具生成
type User struct {
    ID      int64    `json:"id"`
    Name    string   `json:"name"`
    Tags    []string `json:"tags"`
    Address Address  `json:"address"`
}

type Address struct {
    City string `json:"city"`
}

func main() {
    data := []byte(`{
        "id": 1,
        "name": "Alice",
        "tags": ["admin", "dev"],
        "address": {"city": "Beijing"}
    }`)

    var u User
    if err := json.Unmarshal(data, &u); err != nil {
        panic(err)
    }

    fmt.Println(u.Name, u.Address.City)
}

Xử lý JSON với các trường có thể bị thiếu

go

Nếu một số trường API có thể không tồn tại, thay đổi các trường tương ứng thành kiểu con trỏ hoặc sử dụng với thẻ omitempty.

package main

import "encoding/json"

// 手动将字段改为指针,缺失时值为 nil
type User struct {
    ID      *int64  `json:"id,omitempty"`
    Name    *string `json:"name,omitempty"`
    Email   *string `json:"email,omitempty"`
}

func main() {
    data := []byte(`{"id": 1, "name": "Bob"}`)
    var u User
    json.Unmarshal(data, &u)
    if u.Email == nil {
        println("Email 字段缺失")
    }
}

Câu hỏi Thường gặp

Làm thế nào để chuyển đổi JSON thành struct Go?

Dán nội dung JSON vào hộp nhập liệu bên trái, công cụ sẽ tự động chuyển đổi trong vòng 400ms và hiển thị struct Go đã tạo ở bên phải. Bạn cũng có thể kéo thả tải lên tệp .json/.txt, hoặc nhấp 'Mẫu' để tải dữ liệu tích hợp. Sau khi chuyển đổi, sao chép hoặc tải tệp model.go một cú nhấp.

Mã Go được tạo có bao gồm thẻ json không?

Có. Công cụ tạo mã Go dựa trên quicktype-core, và theo mặc định mỗi trường struct đi kèm thẻ `json:"tên_trường_gốc"`, thuận tiện cho tuần tự hóa và giải tuần tự hóa trực tiếp với Unmarshal/Marshal của encoding/json.

Mảng JSON sẽ được chuyển đổi thành slice Go chứ?

Có. Mảng JSON tạo các kiểu slice tương ứng dựa trên kiểu phần tử, ví dụ `["a","b"]` tạo `[]string`, `[1,2,3]` tạo `[]int64`, `[{...},{...}]` tạo các kiểu tùy chỉnh như `[]UserItem`.

Đối tượng lồng sẽ tạo nhiều struct chứ?

Có. Mỗi đối tượng lồng đệ quy tạo một kiểu struct độc lập, được đặt tên theo PascalCase. Ví dụ, đối tượng `address` tạo struct `Address`, được tham chiếu trong struct chính thông qua trường `Address Address`.

Giá trị null tạo kiểu gì?

Giá trị null trong JSON thường được suy luận là `interface{}`, là kiểu dự phòng an toàn. Nếu bạn biết kiểu thực sự của trường, bạn có thể thêm giá trị mẫu trong JSON, tạo lại, sau đó điều chỉnh thủ công thành kiểu cụ thể.

Tôi có thể tùy chỉnh tên struct gốc không?

Có. Công cụ sử dụng tên kiểu gốc (như User) theo mặc định; sau khi sửa đổi tên kiểu gốc trong cài đặt, tất cả các tên kiểu con liên quan sẽ cập nhật đồng bộ, tên tệp tải xuống cũng thay đổi tương ứng.

Phải làm gì nếu JSON có lỗi định dạng?

Công cụ tự động phát hiện tính hợp lệ của JSON. Nếu có các lỗi phổ biến như dấu phẩy đuôi, dấu nháy đơn, thiếu dấu nháy, nút 'Sửa JSON' sẽ xuất hiện. Nhấp vào công cụ sẽ cố gắng tự động sửa và tạo lại struct Go; khi sửa thất bại, vị trí lỗi cụ thể sẽ được đưa ra.

Dữ liệu sẽ được tải lên máy chủ chứ? Có riêng tư và an toàn không?

Không. Tất cả phân tích JSON, suy luận kiểu và tạo mã Go hoàn thành trong trình duyệt của bạn thông qua Web Worker; nội dung đầu vào và mã được tạo không bao giờ tải lên bất kỳ máy chủ nào, cũng không được ghi lại vào đám mây. JSON nhạy cảm chứa khóa API, token hoặc dữ liệu kinh doanh có thể được sử dụng an toàn.

Mã được tạo có thể đặt trực tiếp vào dự án Go không?

Có. Mã được tạo là struct Go tiêu chuẩn với thẻ json, có thể sao chép trực tiếp vào thư mục types/ hoặc models/ của dự án. Chúng tôi khuyên bạn nên tinh chỉnh tên kiểu và tên gói theo quy ước đặt tên của dự án.

Công cụ này miễn phí chứ? Tôi có cần đăng ký không?

Hoàn toàn miễn phí, không cần đăng ký hay đăng nhập. Mở trang và sử dụng ngay lập tức, không giới hạn tính năng, hình mờ hay đăng nhập bắt buộc.

Hỗ trợ tệp JSON kích thước nào?

Công cụ không có giới hạn kích thước tệp nghiêm ngặt, nhưng tốc độ chuyển đổi và hiệu suất hiển thị phụ thuộc vào hiệu suất trình duyệt và thiết bị. Chúng tôi khuyên bạn nên xử lý JSON trong vòng 1MB để có trải nghiệm tốt nhất; đối với JSON quá lớn, hãy xử lý thông qua công cụ định dạng JSON hoặc chia tách trước.

Các kiểu số sẽ đồng nhất tạo float64 chứ?

Không. Công cụ phân biệt số nguyên và số thực: trường số nguyên tạo int64, trường số thực tạo float64. Nếu bạn thích các kiểu cụ thể hơn như int, uint64, hãy thay thế thủ công sau khi tạo.

Xử lý sự cố

Bên phải hiển thị 'Vui lòng nhập dữ liệu JSON'

Hộp nhập liệu bên trái trống hoặc chỉ chứa khoảng trắng. Vui lòng dán JSON hợp lệ, hoặc nhấp 'Mẫu' để tải dữ liệu, hoặc kéo thả tải lên tệp .json/.txt.

Hiển thị lỗi phân tích JSON nhưng không tìm thấy vị trí lỗi

Nhấp nút 'Sửa JSON' bên dưới hộp nhập liệu; công cụ sẽ tự động cố gắng sửa dấu phẩy đuôi, dấu nháy đơn, thiếu dấu nháy, đối tượng kiểu JS và các vấn đề khác. Kết quả đã sửa đổi sẽ được làm nổi bật sau khi sửa.

Tên trường được tạo không tuân thủ quy ước đặt tên Go

Công cụ tạo tên trường PascalCase từ các khóa JSON. Nếu các khóa chứa tiếng Trung hoặc ký tự đặc biệt, tên trường thoát có thể được tạo. Chúng tôi khuyên bạn nên thay đổi các khóa JSON thành tiếng Anh chữ thường hoặc snake_case, sau đó điều chỉnh đồng bộ sau khi tạo.

Trường null tạo interface{}, muốn thay đổi thành kiểu cụ thể

Vì null không thể suy luận kiểu cụ thể, công cụ sử dụng interface{} làm dự phòng. Bạn có thể cung cấp cho trường này một giá trị mẫu (như "" hoặc 0) trong JSON nguồn, tạo lại sau đó thay đổi kiểu thành kiểu thực tế như string/int64.

Trang bị chậm sau khi chuyển đổi JSON lớn

Hiển thị trình duyệt của JSON quá lớn và số lượng struct lớn tiêu tốn bộ nhớ đáng kể. Khuyến nghị: ① Chỉ giữ các trường khóa trong JSON mẫu; ② Chia thành nhiều đối tượng và chuyển đổi riêng biệt; ③ Đóng các tab khác tiêu tốn nhiều bộ nhớ trong trình duyệt.

Kiểu phần tử mảng được suy luận là []interface{}

Khi mảng trống [] hoặc các kiểu phần tử không nhất quán, công cụ sử dụng interface{} làm dự phòng. Bạn có thể thêm các phần tử mẫu cùng kiểu, hoặc thủ công thay đổi kiểu thành các kiểu slice cụ thể như []string, []int64 sau khi tạo.

Thuật ngữ

struct
Kiểu dữ liệu tổng hợp của Go, được sử dụng để kết hợp nhiều trường thành một kiểu. Phần thân mã Go được tạo bởi công cụ này bao gồm một số định nghĩa struct.
slice
Kiểu mảng động của Go, cú pháp []T. Công cụ này ánh xạ mảng JSON thành các slice tương ứng, ví dụ []string, []int64, []UserItem.
json tag
Chuỗi dấu ngoặc ngược sau trường struct Go, ví dụ `json:"user_name"`, được sử dụng để chỉ định tên trường trong quá trình tuần tự hóa/giải tuần tự hóa encoding/json. Công cụ này tự động tạo thẻ này.
interface{}
Kiểu interface rỗng của Go, có thể biểu diễn bất kỳ giá trị nào. Công cụ này sử dụng interface{} làm dự phòng an toàn khi gặp JSON null hoặc không xác định được kiểu.
PascalCase
Phong cách đặt tên mà mỗi từ bắt đầu bằng chữ hoa, ví dụ UserName, AddressCity. Go yêu cầu các trường xuất phải bắt đầu bằng chữ hoa, do đó công cụ này tự động chuyển đổi tên trường JSON thành PascalCase.
encoding/json
Gói mã hóa/giải mã JSON trong thư viện chuẩn của Go. Sau khi các struct được tạo bởi công cụ này được kết hợp với thẻ json, json.Unmarshal và json.Marshal có thể được sử dụng trực tiếp.
unmarshal
Quá trình phân tích luồng byte JSON thành giá trị Go. Sau khi tạo struct, cách sử dụng phổ biến nhất là gọi json.Unmarshal(data, &user).
omitempty
Tùy chọn phổ biến cho thẻ json của Go, ví dụ `json:"name,omitempty"`, có nghĩa là bỏ qua đầu ra khi trường là giá trị không. Công cụ này không tạo omitempty theo mặc định; thêm thủ công khi cần sau khi tạo.

Bảng tra cứu nhanh ánh xạ kiểu JSON sang kiểu Go

Công cụ này tự động suy luận các kiểu Go tương ứng dựa trên kiểu giá trị JSON; các ánh xạ phổ biến như sau:

Ví dụ giá trị JSONKiểu Go được tạoGhi chú
"hello"stringÁnh xạ chuỗi trực tiếp
true / falseboolGiá trị boolean
42int64Số không có dấu thập phân
3.14float64Số có dấu thập phân
nullinterface{}Dự phòng an toàn khi không thể suy luận kiểu cụ thể
["a","b"][]stringMảng chuỗi
[1,2,3][]int64Mảng số nguyên
[{...},{...}][]UserItemMảng đối tượng, các kiểu phần tử được tạo đệ quy
{"id":1}UserĐối tượng tạo struct độc lập

Khuyến nghị lựa chọn kiểu số phổ biến trong Go

Công cụ sử dụng int64 và float64 theo mặc định; điều chỉnh theo nhu cầu trong các dự án thực tế:

Kịch bảnKiểu được khuyến nghịLý do
ID số nguyên thông thường, bộ đếmint64Phù hợp với mặc định công cụ, tương thích với hầu hết các số JSON
Khóa chính tự động tăng cơ sở dữ liệu được biết là dươnguint64Tránh số âm, ngữ nghĩa rõ ràng hơn
Hệ thống 32 bit hoặc số nguyên phạm vi nhỏ rõ ràngint32Giảm mức sử dụng bộ nhớ
Giá cả, tọa độ, tính toán khoa họcfloat64Phù hợp với mặc định công cụ, độ chính xác dấu phẩy động tiêu chuẩn
Tính toán tiền tệ chính xácdecimal.Decimal / intfloat64 có rủi ro độ chính xác; khuyên dùng shopspring/decimal hoặc int theo đơn vị xu

Privacy & Security

Tất cả xử lý của công cụ JSON sang Go này hoàn thành hoàn toàn cục bộ trong trình duyệt của bạn: phân tích JSON, suy luận kiểu, tạo mã Go đều thực thi phía khách thông qua Web Worker; nội dung JSON đầu vào, tệp tải lên và mã Go được tạo không bao giờ tải lên bất kỳ máy chủ nào, cũng không được ghi lại, lưu vào bộ đệm hay lưu trữ vào đám mây. Sau khi đóng hoặc làm mới trang, tất cả nội dung đầu vào và đầu ra tự động bị xóa khỏi bộ nhớ, chỉ localStorage giữ lại lịch sử đầu vào gần đây của bạn (có thể xóa bất cứ lúc nào). Thích hợp để xử lý JSON chứa khóa API, token, dữ liệu kinh doanh nhạy cảm.