Gộp JSON
Công cụ gộp JSON online miễn phí, hợp nhất nhiều đối tượng JSON theo chiến lược tùy chọn (sâu/nông/nối mảng/thay thế mảng) thành một đối tượng duy nhất với 4 chế độ giải quyết xung đột, phù hợp tổng hợp dữ liệu đa nguồn, phân lớp cấu hình, gộp i18n và các tình huống tương tự.
Đề xuất Liên quan
JSON Merge (Gộp JSON) là gì?
JSON Merge (gộp JSON) là thao tác hợp nhất hai hoặc nhiều đối tượng JSON thành một đối tượng mới theo quy tắc nhất định. Đây là thao tác cực kỳ phổ biến trong phát triển phần mềm: ① Gộp JSON trả về từ nhiều microservice thành một response thống nhất (tổng hợp ở tầng BFF - Backend for Frontend); ② Gộp cấu hình base, cấu hình môi trường và cấu hình người dùng thành cấu hình cuối cùng theo logic "cấu hình môi trường ghi đè" (Node.js config, Viper, Spring Cloud Config); ③ Gộp, ghi đè và bổ sung nhiều file dịch i18n thành bộ từ điển hoàn chỉnh; ④ Gộp nhiều mảng dữ liệu mock thành dữ liệu test đầy đủ; ⑤ Gộp nhiều response phân trang API thành kết quả toàn phần.
Điểm khó của việc gộp không nằm ở việc "hợp" mà ở "cách xử lý xung đột". Có 4 chiến lược giải quyết xung đột phổ biến: ① **Deep Merge (Gộp sâu)**: đệ quy vào các object lồng nhau, gộp từng khóa riêng biệt, chỉ ghi đè khi có xung đột ở nút lá — phù hợp phân lớp cấu hình; ② **Shallow Merge (Gộp nông)**: chỉ gộp các khóa ở tầng cao nhất, khóa trùng tên sẽ bị ghi đè toàn bộ, cách đơn giản nhất, tương tự `Object.assign`; ③ **Array Concat (Nối mảng)**: giá trị kiểu mảng sẽ được nối thành một mảng dài giữ nguyên thứ tự tất cả phần tử — phù hợp tổng hợp API; ④ **Array Replace (Thay thế mảng)**: giá trị kiểu mảng lấy giá trị nhập sau làm chuẩn và ghi đè trực tiếp — phù hợp ghi đè cấu hình.
Về mặt triển khai, Deep Merge thường sử dụng đệ quy dạng stack: trước tiên kiểm tra cả hai phía đều là object thuần (không phải mảng, không phải null), sau đó xử lý đệ quy từng khóa; khi gặp kiểu không nhất quán (ví dụ cùng khóa một bên là object một bên là mảng), thường xử lý theo quy tắc "giá trị nhập sau làm chuẩn", không thực hiện chuyển đổi kiểu. Công cụ gộp JSON của GeekFormat tích hợp sẵn 4 chiến lược trên, có thể chuyển đổi trực tiếp trên trang; dán từ 2 đến N đoạn JSON cùng lúc, tự động gộp theo thứ tự và xuất kết quả đã định dạng thống nhất. Toàn bộ quá trình gộp diễn ra cục bộ trên trình duyệt, dữ liệu gốc không được tải lên.
Trường hợp sử dụng
- Gộp response API từ nhiều microservice thành cấu trúc JSON thống nhất cho frontend sử dụng
- Tổng hợp file cấu hình đa tầng base / dev / prod, ghi đè theo môi trường tạo cấu hình cuối cùng
- Gộp, loại bỏ trùng lặp và bổ sung nhiều file dịch i18n theo ngôn ngữ thành từ điển hoàn chỉnh
- Gộp nhiều mảng dữ liệu mock hoặc nhiều response API phân trang thành tập dữ liệu hoàn chỉnh
- Gộp cấu hình mặc định component frontend + cấu hình tùy chỉnh người dùng + cấu hình A/B testing từ xa
- Trong di chuyển dữ liệu, gộp file xuất JSON từ nhiều hệ thống nguồn, thống nhất thành định dạng hạ nguồn
Cách Sử dụng
- Dán tuần tự từ 2 đến N đoạn JSON cần gộp vào ô nhập bên trái (mặc định 2 ô), hoặc nhấn「+」để thêm nhiều đầu vào hơn
- Chọn chiến lược gộp trong hộp chọn thả xuống của thanh công cụ: Gộp sâu (Deep) / Gộp nông (Shallow) / Nối mảng (Array Concat) / Thay thế mảng (Array Replace)
- Nhấn nút「Gộp」, ô xuất bên phải sẽ hiển thị kết quả đã định dạng sau khi gộp; nếu đầu vào có lỗi cú pháp sẽ hiển thị số dòng cụ thể và thông báo lỗi
- Sau khi xác nhận kết quả chính xác, nhấn「Sao chép」để đưa kết quả gộp vào bộ nhớ đệm, hoặc nhấn「Tải xuống」để lưu thành file merged.json tiếp tục xử lý định dạng, xác thực Schema và các bước tiếp theo
Tính năng
- 4 chiến lược gộp: Gộp sâu / Gộp nông / Nối mảng / Thay thế mảng, chuyển đổi một cú nhấp đáp ứng các tình huống nghiệp vụ khác nhau
- Hỗ trợ từ 2 đến N đoạn JSON: mặc định 2 ô nhập, nhấn「+」để thêm động nhiều JSON nguồn hơn, linh hoạt thích ứng tổng hợp đa nguồn
- Gộp đệ quy sâu: xử lý thông minh object lồng nhau đa tầng, xung đột nút lá xử lý theo chiến lược chỉ định, giữ lại mọi trường hợp lệ
- Giải quyết xung đột linh hoạt: xung đột tầng cao nhất thực hiện theo chiến lược đã chọn; xung đột object lồng nhau sẽ đi vào gộp sâu; xung đột mảng phân biệt xử lý theo arrayConcat/arrayReplace
- Xuất định dạng thống nhất: kết quả gộp hiển thị với thụt lề 2 khoảng trắng, thuận tiện xem xét thủ công và sao chép trực tiếp sang công cụ hạ nguồn
- Thực thi gộp thời gian thực: dán xong nhấn「Gộp」là có kết quả, khi lỗi hiển thị số dòng JSON cụ thể và thông báo lỗi
- Xử lý cục bộ bảo vệ quyền riêng tư: phân tích cú pháp, gộp, định dạng đều hoàn thành cục bộ trên trình duyệt, nội dung nhập không gửi đến bất kỳ máy chủ nào
- Kết nối liền mạch hạ nguồn: kết quả gộp có thể sao chép một cú nhấp sang công cụ Định dạng JSON, Xác thực Schema, Sinh mã và các công cụ khác để tiếp tục xử lý
Ví dụ mã
Sử dụng lodash merge để gộp sâu trong JavaScript
javascript// npm install lodash.merge
import merge from 'lodash.merge';
const a = { user: { name: 'Alice', age: 28 }, tags: ['admin'] };
const b = { user: { email: 'a@x.com', age: 29 }, tags: ['editor'] };
// Gộp sâu: object lồng nhau được gộp đệ quy, nút lá giá trị sau ghi đè giá trị trước
const deep = merge({}, a, b);
console.log(deep);
// => { user: { name: 'Alice', age: 29, email: 'a@x.com' }, tags: ['admin', 'editor'] }
// Gộp nông: khóa tầng cao nhất bị ghi đè toàn bộ, không đi vào lồng nhau
const shallow = Object.assign({}, a, b);
console.log(shallow);
// => { user: { email: 'a@x.com', age: 29 }, tags: ['editor'] }Sử dụng mergedeep để gộp sâu trong Python
python# pip install mergedeep
from mergedeep import merge
a = {"user": {"name": "Alice", "age": 28}, "tags": ["admin"]}
b = {"user": {"email": "a@x.com", "age": 29}, "tags": ["editor"]}
# Gộp sâu
result = merge(a, b)
print(result)
# => {'user': {'name': 'Alice', 'age': 29, 'email': 'a@x.com'}, 'tags': ['admin', 'editor']}
# Lưu ý: mergedeep mặc định gộp mảng, chuỗi/số thì ghi đè
# Nếu cần ghi đè mảng, thêm strategy='override'Sử dụng jq -s để gộp nhiều JSON trên dòng lệnh
bash# Nối nhiều mảng JSON thành một mảng dài
jq -s 'add' a.json b.json c.json
# Gộp đệ quy nhiều đối tượng JSON (jq 1.6+)
jq -s 'reduce .[] as $item ({}; . * $item)' a.json b.json
# Gộp nông: ghi đè khóa tầng cao nhất của b lên a
jq -s '.[0] * .[1]' a.json b.json
# Sau khi gộp mảng, chỉ giữ lại trường id đã loại trùng
jq -s '[.[].items[]] | unique_by(.id)' a.json b.jsonCâu hỏi Thường gặp
Gộp JSON và nối JSON có giống nhau không?
Không hoàn toàn giống. "Nối" thường chỉ việc nối chuỗi trực tiếp lại với nhau, không có cấu trúc; "gộp" là việc hợp nhất nhiều object thành một theo cấu trúc JSON một cách đệ quy, có xử lý xung đột tên khóa. Công cụ này thực hiện ý thứ hai — gộp JSON có cấu trúc.
Chọn gộp sâu hay gộp nông như thế nào?
Gộp nông: chỉ xử lý khóa tầng cao nhất, khóa trùng tên bị thay thế toàn bộ, tương tự `Object.assign`, đơn giản và trực tiếp nhất. Gộp sâu: đệ quy vào object lồng nhau, gộp từng nút lá riêng biệt, thông minh hơn. Nếu nhiều JSON của bạn thêm trường ở các đường dẫn con khác nhau (như base.user.name với override.user.email), hãy dùng gộp sâu; nếu muốn thay thế toàn bộ object con một lần, dùng gộp nông.
Khi gộp mảng thì theo thứ tự hay theo chỉ số?
Công cụ này mặc định theo ngữ nghĩa "nối": nối nhiều mảng thành một mảng dài giữ nguyên thứ tự tất cả phần tử. Nếu hai mảng của bạn có cùng độ dài và muốn ghi đè từng phần tử theo chỉ số, hãy chuyển sang "arrayReplace" và thủ công bọc mảng bằng cấu trúc object.
Khi tên khóa xung đột, ai ghi đè lên ai?
Quyết định theo thứ tự nhập: JSON đứng sau sẽ ghi đè khóa trùng tên của JSON đứng trước (dưới chiến lược gộp nông/thay thế mảng thì ghi đè toàn bộ, dưới gộp sâu thì chỉ ghi đè nút lá). Nếu muốn ưu tiên "nhập trước", hãy đảo ngược thứ tự nhập.
Có hỗ trợ gộp mảng JSON không?
Có. Hai tình huống điển hình: ① Nhiều JSON đều là mảng → dùng "arrayConcat" để nối thành một mảng dài; ② Nhiều JSON đều là object, trong đó trường nào đó là mảng → dùng "arrayConcat" để gộp nhiều mảng, hoặc dùng "arrayReplace" để lấy giá trị nhập sau làm chuẩn.
Có thể gộp hơn 2 JSON cùng lúc không?
Được. Mặc định cung cấp 2 ô nhập, nhấn nút「+」có thể thêm động nhiều ô nhập hơn; tất cả đầu vào được gộp tuần tự theo thứ tự từ trên xuống. Về lý thuyết không giới hạn số lượng, nhưng bộ nhớ trình duyệt sẽ giới hạn kích thước mỗi đoạn.
Thứ tự khóa sau khi gộp được xác định như thế nào?
Gộp sâu: thứ tự khóa của JSON đầu tiên được ưu tiên, khóa mới của JSON thứ hai được thêm vào cuối tầng tương ứng. Gộp nông: theo thứ tự nhập, tất cả khóa của JSON đầu tiên xuất hiện trước, khóa mới của JSON sau thêm vào ở tầng cao nhất; khóa trùng tên giữ nguyên thứ tự của JSON đầu tiên.
Công cụ có tự ý thay đổi kiểu trường không?
Không chủ động thay đổi kiểu. Nếu dưới chiến lược gộp nông/thay thế mảng mà cùng khóa ở hai JSON một bên là object, một bên là mảng, sẽ xử lý theo "giá trị nhập sau làm chuẩn" và ghi đè trực tiếp, không thực hiện chuyển đổi kiểu. Gộp sâu chỉ đệ quy khi "cả hai phía đều là object thuần", các trường hợp khác đều xử lý theo cách ghi đè.
Có giữ được giá trị null không?
Được. null là giá trị hợp lệ trong JSON, công cụ này xử lý null như giá trị lá thông thường: khi gộp nông/thay thế mảng, null ở giá trị nhập sau sẽ ghi đè giá trị trước; khi gộp sâu gặp null sẽ xử lý theo quy tắc ghi đè, không bị bỏ qua đặc biệt.
Sau khi gộp có xuất thông tin thống kê không?
Có. Khu vực kết quả sẽ hiển thị số đoạn JSON tham gia gộp và tổng số khóa, thuận tiện đối chiếu kết quả nhanh chóng; để xem danh sách trường chi tiết vui lòng xem trực tiếp đầu ra đã định dạng ở bên phải.
Công cụ có tải JSON của tôi lên máy chủ không?
Không. Phân tích cú pháp, gộp, định dạng đều hoàn thành cục bộ trên trình duyệt, đầu vào và kết quả trung gian không gửi đến bất kỳ máy chủ nào. Có thể sử dụng ngoại tuyến, phù hợp xử lý JSON đa nguồn chứa thông tin nhạy cảm (như cấu hình môi trường production, response API nội bộ).
Thứ tự tốt nhất khi kết hợp với Định dạng JSON và Xác thực Schema là gì?
Chu trình đề xuất: ① Sửa JSON (làm sạch JSON không hợp lệ) → ② Gộp JSON bằng công cụ này (gộp đa nguồn) → ③ Định dạng JSON (thụt lề thống nhất) → ④ Xác thực JSON Schema (kiểm tra cấu trúc cuối cùng) → ⑤ Sinh mã hạ nguồn (TypeScript / Java / Go, v.v.). Chọn một vài bước trong đó tùy nhu cầu.
Xử lý sự cố
Gộp báo lỗi "Unexpected token" hoặc "Invalid JSON"
Nguyên nhân: ít nhất một ô nhập chứa JSON không hợp lệ. Cách khắc phục: trước tiên dán JSON bị lỗi vào công cụ「Sửa JSON」để làm sạch (tự động xử lý dấu phẩy cuối, dấu nháy đơn, khóa không có dấu ngoặc kép, v.v.), sau đó quay lại công cụ này để gộp; hoặc kiểm tra xem có thiếu dấu ngoặc nhọn / ngoặc vuông bao ngoài không.
Sau khi gộp một số trường không xuất hiện
Nguyên nhân: dưới chiến lược gộp nông/thay thế mảng, khóa trùng tên bị giá trị nhập sau ghi đè toàn bộ; dưới gộp sâu, trường có giá trị null cũng sẽ ghi đè object đứng trước. Cách khắc phục: chuyển chiến lược sang「Gộp sâu」để xem xét từng tầng; nếu xác nhận là null ở giá trị sau ghi đè, hãy xóa trường null khỏi JSON nhập sau hoặc thay bằng giá trị giữ chỗ.
Mảng bị ghi đè thay vì nối
Nguyên nhân: chiến lược hiện tại là「Gộp nông」hoặc「Thay thế mảng」. Cách khắc phục: chuyển sang「Nối mảng (Array Concat)」trong hộp chọn thả xuống của thanh công cụ; hoặc thủ công nối hai mảng thành một trước khi gộp.
Trong kết quả gộp sâu, object biến thành mảng hoặc ngược lại
Nguyên nhân: hai JSON ở cùng đường dẫn có kiểu không nhất quán "object vs mảng", khi gộp sâu gặp kiểu không nhất quán sẽ xử lý theo "giá trị nhập sau làm chuẩn". Cách khắc phục: thống nhất kiểu của cả hai phía (đều đổi thành object hoặc đều thành mảng), hoặc chuyển sang chiến lược gộp nông/thay thế mảng để rõ ràng ngữ nghĩa.
Thứ tự khóa sau khi gộp bị lộn xộn
Nguyên nhân: khóa mới của JSON thứ hai sẽ được chèn vào sau JSON đầu tiên theo "vị trí chèn", trình duyệt/bộ phân tích cú pháp sẽ tự động sắp xếp các khóa số nguyên thuần theo thứ tự số. Cách khắc phục: trước tiên dùng công cụ「Sắp xếp JSON」thống nhất thứ tự tên khóa cho tất cả JSON đầu vào, rồi mới gộp; hoặc sắp xếp lại một lần nữa trước khi sử dụng kết quả.
Gộp file lớn (10 MB+) bị treo
Nguyên nhân: trình duyệt JSON.parse nhiều đoạn văn bản lớn cùng lúc sẽ chiếm nhiều bộ nhớ. Cách khắc phục: kiểm soát mỗi đầu vào trong khoảng 1-2 MB; xử lý file cực lớn trên máy cục bộ bằng script Node.js (lodash.merge) hoặc Python (mergedeep); xử lý xong lại dùng công cụ này để xác minh nhỏ.
Thuật ngữ
- JSON Merge
- Thao tác hợp nhất hai hoặc nhiều đối tượng JSON thành một đối tượng mới theo quy tắc chỉ định; điểm mấu chốt là "chiến lược giải quyết khi tên khóa bị xung đột".
- Deep Merge / Gộp sâu
- Chiến lược đệ quy vào object lồng nhau, gộp từng nút lá riêng biệt; khi cả hai phía đều là object thuần thì đệ quy, ngược lại xử lý theo cách ghi đè.
- Shallow Merge / Gộp nông
- Chiến lược chỉ gộp các khóa tầng cao nhất, khóa trùng tên bị ghi đè toàn bộ; trong JS tương đương với `Object.assign({}, a, b)`.
- Array Concat / Nối mảng
- Một trong những chiến lược gộp mảng: nối nhiều mảng thành một mảng dài giữ nguyên thứ tự tất cả phần tử; thường dùng để tổng hợp response API.
- Array Replace / Thay thế mảng
- Một trong những chiến lược gộp mảng: mảng trùng tên lấy giá trị nhập sau làm chuẩn ghi đè toàn bộ; thường dùng để ghi đè cấu hình.
- Object.assign
- Phương thức có sẵn của JavaScript, sao chép nông (shallow copy) tất cả thuộc tính riêng có thể đếm được từ một hoặc nhiều object nguồn sang object đích; là triển khai chuẩn thực tế của Shallow Merge.
- lodash.merge
- Hàm gộp sâu được cung cấp bởi thư viện Lodash, là triển khai deep merge phổ biến nhất trong hệ sinh thái Node.js; mảng được gộp thay vì ghi đè.
- mergedeep (Python)
- Thư viện gộp sâu trong hệ sinh thái Python, cài đặt bằng pip install mergedeep; hỗ trợ tham số strategy để kiểm soát hành vi gộp/ghi đè mảng.
- jq -s 'add'
- Lệnh jq cộng nhiều mảng JSON thành một mảng duy nhất; để gộp nhiều object JSON cần dùng `reduce .[] as $item ({}; . * $item)`.
- BFF (Backend for Frontend)
- Lớp tổng hợp nằm giữa frontend và các dịch vụ backend trong kiến trúc microservice; thường cần gộp response JSON từ nhiều service thành response thống nhất, là tình huống kinh điển của JSON Merge.
So sánh 4 chiến lược gộp JSON
| Chiến lược | Phạm vi | Xử lý mảng | Tình huống điển hình |
|---|---|---|---|
| Gộp sâu (Deep) | Đệ quy mọi tầng lồng nhau | Theo arrayConcat/arrayReplace đã chọn | Phân lớp cấu hình đa môi trường, gộp từ điển i18n |
| Gộp nông (Shallow) | Chỉ gộp tầng cao nhất | Ghi đè toàn bộ | Ghi đè đơn giản kiểu Object.assign |
| Nối mảng (Array Concat) | Tầng cao nhất | Nối thành mảng mới | Tổng hợp API phân trang, gộp dữ liệu mock |
| Thay thế mảng (Array Replace) | Tầng cao nhất | Lấy giá trị nhập sau | Ghi đè cấu hình Feature Flag |
Bảng đối chiếu triển khai gộp JSON phổ biến
| Thư viện/công cụ | Ngôn ngữ | Hành vi mặc định | Ghi chú |
|---|---|---|---|
| Object.assign | JavaScript | Gộp nông | Thư viện chuẩn ES2015; từ ES2017 có thể dùng `Object.assign({}, a, b)` |
| { ...a, ...b } | JavaScript | Gộp nông | Toán tử spread, cú pháp gọn gàng hơn |
| lodash.merge | JavaScript | Gộp sâu | Mảng được gộp không ghi đè, npm install lodash.merge |
| mergedeep | Python | Gộp sâu | strategy='override' đổi gộp mảng thành ghi đè |
| deepmerge (Python) | Python | Gộp sâu | Một triển khai phổ biến khác, pip install deepmerge |
| jq -s 'add' | Shell | Cộng mảng | Gộp object cần `reduce .[] as $i ({}; . * $i)` |
Authoritative References
- Nén JSON
- CSV sang JSON
- JSON sang CSV
- JSON Diff
- JSON Escape / Unescape
- Làm phẳng JSON
- Trình định dạng JSON
- Trinh tao JSON
- Truy vấn JSONPath
- Gộp JSON
- Sửa JSON
- Trình Xác Thực JSON Schema
- Sắp xếp JSON
- JSON Stringify
- JSON sang HTML
- JSON sang Java
- JSON sang Markdown
- JSON sang SQL
- JSON sang TOML
- JSON sang TypeScript
- XML sang JSON
- Chuyen JSON sang XML
- YAML sang JSON
- JSON → YAML
- JSON sang Go
- JSON sang Rust
- JSON sang Swift
- JSON sang C#
- JSON sang C++
- JSON sang PHP
- JSON sang Python