Tất cả bài viết

JSON Flatten: biến cấu trúc lồng nhau thành danh sách phẳng

Đối tượng và mảng lồng nhau phù hợp để biểu diễn cấu trúc, nhưng bất tiện ở những nơi cần danh sách phẳng gồm cặp khóa-giá trị — bảng tính, dòng log, hay file dịch thuật. Flatten (làm phẳng) giải quyết đúng sự lệch pha này.

Cách hoạt động

Mỗi trường lồng nhau trở thành một dòng, trong đó khóa là đường dẫn đầy đủ tới giá trị (viết bằng dấu chấm hoặc chỉ số trong ngoặc vuông), còn giá trị chính là giá trị đó. {"nguoiDung": {"diaChi": {"thanhPho": "Đà Nẵng"}}} trở thành cặp nguoiDung.diaChi.thanhPho → "Đà Nẵng". Phần tử mảng nhận một chỉ số trong đường dẫn, ví dụ items[0].ten.

Nơi thường gặp: file dịch thuật (i18n)

Khóa phẳng dùng ký hiệu chấm là định dạng chuẩn cho file bản địa hóa trong các thư viện như i18next hay vue-i18n — settings.profile.title thay vì một cây JSON lồng nhau. Các nền tảng dịch thuật và quy trình dựa trên bảng tính hầu như luôn mong đợi dạng phẳng này, nên làm phẳng một file ngôn ngữ lồng nhau thường là bước đầu tiên trước khi gửi cho người dịch.

Dùng để làm gì trong thực tế

  • Nhập dữ liệu lồng nhau từ API vào bảng tính hoặc bảng dữ liệu phẳng.
  • Giúp việc so sánh từng dòng giữa hai đối tượng phức tạp trở nên dễ đọc.
  • Tìm nhanh một giá trị cụ thể trong JSON lồng nhau sâu, bằng cách nhìn thấy toàn bộ đường dẫn ngay lập tức.

Thao tác ngược lại: unflatten

Khôi phục cấu trúc lồng nhau từ danh sách phẳng nghĩa là tách mỗi khóa thành các đoạn đường dẫn (dựa vào dấu chấm và chỉ số trong ngoặc vuông), rồi dựng dần các đối tượng và mảng lồng nhau. Sự mơ hồ xuất hiện khi một đường dẫn có thể mang hai nghĩa — nếu dữ liệu vừa có khóa nguyên văn "a.b" vừa có đường dẫn lồng nhau a.b, unflatten không thể đoán được ý định thực sự, và sẽ báo xung đột thay vì âm thầm ghi đè.

Dùng thử công cụ