Giới thiệu

JSON (JavaScript Object Notation) là một trong những định dạng dữ liệu được sử dụng rộng rãi nhất để truyền tải thông tin có cấu trúc giữa các hệ thống. Một trong những khối xây dựng cốt lõi của nó là mảng, cho phép bạn đại diện cho các danh sách dữ liệu có thứ tự như chuỗi, số, đối tượng, hoặc thậm chí là các mảng khác.

Cho dù bạn đang định nghĩa các tệp cấu hình, gửi dữ liệu đến một API, hay xử lý phản hồi từ máy chủ, việc hiểu cách sử dụng mảng trong JSON là rất quan trọng. Hướng dẫn này sẽ đề cập đến cách mảng hoạt động, cách định nghĩa chúng, truy cập chúng trong mã, và xử lý các trường hợp phức tạp hơn như mảng các đối tượng.

Mảng trong JSON là gì?

Một mảng JSON là một danh sách có thứ tự được bao quanh bởi dấu ngoặc vuông []. Nó có thể chứa bất kỳ sự kết hợp nào của các giá trị, bao gồm:

  • Chuỗi
  • Số
  • Boolean
  • Đối tượng
  • Các mảng khác
  • null

Ví dụ: Mảng chuỗi

{
  "colors": ["red", "green", "blue"]
}

Mảng JSON của các đối tượng

Một trong những mẫu mạnh mẽ nhất trong JSON là mảng các đối tượng. Điều này được sử dụng để đại diện cho các tập hợp dữ liệu có cấu trúc — như danh sách người dùng, sản phẩm, hoặc đơn hàng.

Ví dụ: Mảng các đối tượng

{
  "users": [
    { "id": 1, "name": "Alice", "email": "alice@example.com" },
    { "id": 2, "name": "Bob", "email": "bob@example.com" }
  ]
}

Mảng JSON của các mảng

Một mảng JSON của các mảng là một cấu trúc dữ liệu lồng nhau, nơi mỗi mục bên trong mảng ngoài cũng là một mảng. Cấu trúc này thường được sử dụng để đại diện cho dữ liệu bảng, ma trận, hoặc tập hợp tọa độ, nơi mỗi mảng bên trong giữ một nhóm giá trị liên quan.

Ví dụ: Ma trận (Lưới 2D)

{
  "matrix": [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
  ]
}

Ví dụ: Tọa độ

{
  "coordinates": [
    [35.6895, 139.6917],     // Tokyo
    [34.0522, -118.2437],    // Los Angeles
    [51.5074, -0.1278]       // London
  ]
}

Cách thao tác với mảng JSON trong các ngôn ngữ phổ biến?

Khi bạn đã phân tích một chuỗi JSON thành một cấu trúc dữ liệu gốc, bạn có thể dễ dàng lặp, lọc, map, hoặc thay đổi các mảng bằng cách sử dụng các công cụ tích hợp sẵn của ngôn ngữ.

Dưới đây là các ví dụ trong một số ngôn ngữ phổ biến nhất:

1. Thao tác với mảng JSON trong JavaScript/TypeScript

Mảng JSON được sử dụng rộng rãi trong JavaScript và TypeScript để xử lý dữ liệu có cấu trúc — đặc biệt khi làm việc với phản hồi từ API, lưu trữ cục bộ, cơ sở dữ liệu, hoặc hiển thị UI động. Hiểu cách thao tác với chúng một cách hiệu quả là chìa khóa để viết mã sạch và hiệu quả.

Dưới đây là một số thao tác phổ biến mà bạn sẽ thường cần khi làm việc với mảng JSON:

// Mảng JSON mẫu của các đối tượng
const users = [
  { name: "Alice", active: true },
  { name: "Bob", active: false },
  { name: "Carol", active: true }
];

// 1. Lặp qua mảng
users.forEach(user => {
  console.log("Tên người dùng:", user.name);
});

// 2. Lọc các mục
const activeUsers = users.filter(user => user.active);
console.log("Người dùng đang hoạt động:", activeUsers);

// 3. Sắp xếp theo tên
const sortedUsers = [...users].sort((a, b) => a.name.localeCompare(b.name));
console.log("Người dùng đã sắp xếp:", sortedUsers);

// 4. Thêm một mục mới
users.push({ name: "Dave", active: true });
console.log("Sau khi thêm Dave:", users);

// 5. Xóa một mục theo chỉ số (ví dụ: xóa người dùng thứ hai)
users.splice(1, 1);
console.log("Sau khi xóa người dùng thứ hai:", users);

// 6. Tìm một người dùng theo tên
const foundUser = users.find(user => user.name === "Alice");
console.log("Tìm thấy người dùng:", foundUser);

// 7. Cập nhật một đối tượng trong mảng (ví dụ: đặt Bob thành hoạt động nếu anh ấy tồn tại)
const updatedUsers = users.map(user =>
  user.name === "Bob" ? { ...user, active: true } : user
);
console.log("Người dùng đã cập nhật:", updatedUsers);

// 8. Chuyển đổi mảng thành chuỗi JSON
const jsonString = JSON.stringify(users);
console.log("Chuỗi JSON:", jsonString);

// 9. Phân tích chuỗi JSON trở lại thành mảng
const parsedUsers = JSON.parse(jsonString);
console.log("Người dùng đã phân tích:", parsedUsers);

2. Thao tác với mảng JSON trong Python

Trong Python, mảng JSON thường được đại diện dưới dạng danh sách, và các đối tượng JSON dưới dạng từ điển. Mô-đun json tích hợp sẵn của Python giúp bạn dễ dàng làm việc với dữ liệu JSON — cho dù bạn đang tiêu thụ phản hồi từ API, đọc các tệp cấu hình, hay chuẩn bị dữ liệu có cấu trúc để xuất.

Sử dụng danh sách các từ điển (tức là, mảng JSON của các đối tượng) là một mẫu phổ biến khi xử lý dữ liệu trong Python. Cấu trúc này vừa linh hoạt vừa mạnh mẽ, cho phép bạn thực hiện các thao tác như lọc, sắp xếp, cập nhật, và tuần tự hóa một cách dễ dàng với các tính năng tích hợp sẵn của Python như list comprehensions, sorted(), và unpacking từ điển.

import json

# Mảng JSON mẫu của các đối tượng (danh sách Python của dicts)
users = [
    { "name": "Alice", "active": True },
    { "name": "Bob", "active": False },
    { "name": "Carol", "active": True }
]

# 1. Lặp qua mảng
for user in users:
    print("Tên người dùng:", user["name"])

# 2. Lọc các mục
active_users = [user for user in users if user["active"]]
print("Người dùng đang hoạt động:", active_users)

# 3. Sắp xếp theo tên
sorted_users = sorted(users, key=lambda user: user["name"])
print("Người dùng đã sắp xếp:", sorted_users)

# 4. Thêm một mục mới
users.append({ "name": "Dave", "active": True })
print("Sau khi thêm Dave:", users)

# 5. Xóa một mục theo chỉ số (ví dụ: xóa người dùng thứ hai)
users.pop(1)
print("Sau khi xóa người dùng thứ hai:", users)

# 6. Tìm một người dùng theo tên
found_user = next((user for user in users if user["name"] == "Alice"), None)
print("Tìm thấy người dùng:", found_user)

# 7. Cập nhật một đối tượng trong mảng (ví dụ: đặt Bob thành hoạt động nếu anh ấy tồn tại)
updated_users = [
    { **user, "active": True } if user["name"] == "Bob" else user
    for user in users
]
print("Người dùng đã cập nhật:", updated_users)

# 8. Chuyển đổi mảng thành chuỗi JSON
json_string = json.dumps(users)
print("Chuỗi JSON:", json_string)

# 9. Phân tích chuỗi JSON trở lại thành mảng
parsed_users = json.loads(json_string)
print("Người dùng đã phân tích:", parsed_users)

3. Thao tác với mảng JSON trong Java

Trong Java, mảng JSON thường được đại diện bằng List<Map<String, Object>> khi làm việc với các thư viện như Jackson, Gson, hoặc org.json. Những thư viện này cho phép bạn phân tích, tạo ra, và thao tác với dữ liệu JSON một cách dễ dàng.

Thao tác với mảng JSON trong Java là rất quan trọng khi xử lý phản hồi từ REST API, lưu trữ dữ liệu, hoặc các tệp cấu hình. Vì Java là một ngôn ngữ kiểu tĩnh, bạn sẽ thường cần ánh xạ dữ liệu JSON thành POJOs (Plain Old Java Objects), hoặc sử dụng các kiểu linh hoạt như List và Map khi cấu trúc là động.

Ví dụ (Sử dụng Jackson)

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.*;
import java.util.stream.Collectors;

public class JsonArrayExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Chuỗi JSON mẫu
        String json = "[{\"name\":\"Alice\",\"active\":true},{\"name\":\"Bob\",\"active\":false},{\"name\":\"Carol\",\"active\":true}]";

        // 1. Phân tích chuỗi JSON thành List của Map
        List<Map<String, Object>> users = mapper.readValue(json, new TypeReference<List<Map<String, Object>>>() {});
        System.out.println("Người dùng gốc: " + users);

        // 2. Lặp qua mảng
        for (Map<String, Object> user : users) {
            System.out.println("Tên người dùng: " + user.get("name"));
        }

        // 3. Lọc người dùng đang hoạt động
        List<Map<String, Object>> activeUsers = users.stream()
                .filter(user -> Boolean.TRUE.equals(user.get("active")))
                .collect(Collectors.toList());
        System.out.println("Người dùng đang hoạt động: " + activeUsers);

        // 4. Sắp xếp theo tên
        users.sort(Comparator.comparing(user -> (String) user.get("name")));
        System.out.println("Người dùng đã sắp xếp: " + users);

        // 5. Thêm một người dùng mới
        Map<String, Object> newUser = new HashMap<>();
        newUser.put("name", "Dave");
        newUser.put("active", true);
        users.add(newUser);
        System.out.println("Sau khi thêm Dave: " + users);

        // 6. Xóa một người dùng theo chỉ số
        users.remove(1);
        System.out.println("Sau khi xóa người dùng thứ hai: " + users);

        // 7. Tìm một người dùng theo tên
        Map<String, Object> found = users.stream()
                .filter(user -> "Alice".equals(user.get("name")))
                .findFirst()
                .orElse(null);
        System.out.println("Tìm thấy người dùng: " + found);

        // 8. Cập nhật Bob thành hoạt động (nếu tồn tại)
        for (Map<String, Object> user : users) {
            if ("Bob".equals(user.get("name"))) {
                user.put("active", true);
            }
        }

        // 9. Chuyển đổi danh sách trở lại thành chuỗi JSON
        String updatedJson = mapper.writeValueAsString(users);
        System.out.println("Chuỗi JSON đã cập nhật: " + updatedJson);
    }
}

4. Thao tác với mảng JSON trong PHP

Trong PHP, mảng JSON thường được giải mã thành mảng liên kết (cho các đối tượng JSON) hoặc mảng chỉ mục (cho các danh sách JSON). PHP cung cấp các hàm tích hợp như json_decode() và json_encode() để phân tích và tuần tự hóa dữ liệu JSON, giúp bạn dễ dàng thao tác với các cấu trúc JSON trực tiếp.

Làm việc với các mảng của các đối tượng (tức là, một mảng JSON của các mảng liên kết) là một mẫu phổ biến khi xử lý phản hồi từ API, các tệp cấu hình, hoặc các cuộc gọi AJAX. Cấu trúc mảng linh hoạt của PHP giúp bạn rất thuận tiện trong việc thực hiện các thao tác như lọc, sắp xếp, cập nhật, và tuần tự hóa các mảng JSON.

<?php

// Chuỗi JSON mẫu
$json = '[{"name":"Alice","active":true},{"name":"Bob","active":false},{"name":"Carol","active":true}]';

// 1. Giải mã chuỗi JSON thành mảng PHP
$users = json_decode($json, true);
echo "Người dùng gốc:\n";
print_r($users);

// 2. Lặp qua mảng
foreach ($users as $user) {
    echo "Tên người dùng: " . $user['name'] . "\n";
}

// 3. Lọc người dùng đang hoạt động
$activeUsers = array_filter($users, function ($user) {
    return $user['active'] === true;
});
echo "Người dùng đang hoạt động:\n";
print_r($activeUsers);

// 4. Sắp xếp người dùng theo tên
usort($users, function ($a, $b) {
    return strcmp($a['name'], $b['name']);
});
echo "Người dùng đã sắp xếp:\n";
print_r($users);

// 5. Thêm một người dùng mới
$users[] = ["name" => "Dave", "active" => true];
echo "Sau khi thêm Dave:\n";
print_r($users);

// 6. Xóa một người dùng theo chỉ số (ví dụ: xóa người dùng thứ hai)
array_splice($users, 1, 1);
echo "Sau khi xóa người dùng thứ hai:\n";
print_r($users);

// 7. Tìm một người dùng theo tên
$foundUser = null;
foreach ($users as $user) {
    if ($user['name'] === 'Alice') {
        $foundUser = $user;
        break;
    }
}
echo "Tìm thấy người dùng:\n";
print_r($foundUser);

// 8. Cập nhật Bob thành hoạt động nếu tồn tại
foreach ($users as &$user) {
    if ($user['name'] === 'Bob') {
        $user['active'] = true;
    }
}
unset($user); // phá vỡ tham chiếu

// 9. Mã hóa trở lại thành JSON
$updatedJson = json_encode($users, JSON_PRETTY_PRINT);
echo "JSON đã cập nhật:\n";
echo $updatedJson;

5. Thao tác với mảng JSON trong Ruby

Trong Ruby, mảng JSON thường được phân tích thành mảng của các hash bằng cách sử dụng thư viện json tích hợp sẵn. Cấu trúc này rất lý tưởng cho việc làm việc với phản hồi từ API, các tệp cấu hình, và bất kỳ trao đổi dữ liệu có cấu trúc nào. Cú pháp biểu cảm của Ruby và các phương thức enumerable (each, select, sort_by, map, v.v.) giúp bạn rất thuận tiện trong việc thao tác với các mảng JSON.

require 'json'

# Chuỗi JSON mẫu
json = '[{"name":"Alice","active":true},{"name":"Bob","active":false},{"name":"Carol","active":true}]'

# 1. Phân tích chuỗi JSON thành mảng Ruby của các hash
users = JSON.parse(json)
puts "Người dùng gốc:"
puts users

# 2. Lặp qua mảng
users.each do |user|
  puts "Tên người dùng: #{user['name']}"
end

# 3. Lọc người dùng đang hoạt động
active_users = users.select { |user| user['active'] }
puts "Người dùng đang hoạt động:"
puts active_users

# 4. Sắp xếp người dùng theo tên
sorted_users = users.sort_by { |user| user['name'] }
puts "Người dùng đã sắp xếp:"
puts sorted_users

# 5. Thêm một người dùng mới
users << { 'name' => 'Dave', 'active' => true }
puts "Sau khi thêm Dave:"
puts users

# 6. Xóa một người dùng theo chỉ số (ví dụ: xóa người dùng thứ hai)
users.delete_at(1)
puts "Sau khi xóa người dùng thứ hai:"
puts users

# 7. Tìm một người dùng theo tên
found_user = users.find { |user| user['name'] == 'Alice' }
puts "Tìm thấy người dùng:"
puts found_user

# 8. Cập nhật Bob thành hoạt động (nếu tồn tại)
users.map! do |user|
  user['name'] == 'Bob' ? user.merge('active' => true) : user
end

# 9. Chuyển đổi trở lại thành chuỗi JSON
updated_json = JSON.pretty_generate(users)
puts "Chuỗi JSON đã cập nhật:"
puts updated_json

6. Thao tác với mảng JSON trong Golang

Trong Go, mảng JSON thường được giải mã thành các slice của structs hoặc []map[string]interface{} cho các cấu trúc động. Gói encoding/json cung cấp các công cụ mạnh mẽ và linh hoạt để mã hóa/giải mã JSON. Việc thao tác với JSON là phổ biến trong Go khi xử lý REST APIs, các tệp cấu hình, hoặc chuyển đổi dữ liệu.

Việc phân loại và hiệu suất nghiêm ngặt của Go làm cho nó trở thành lựa chọn lý tưởng cho việc xử lý JSON mạnh mẽ, đặc biệt khi định nghĩa các kiểu tùy chỉnh cho dữ liệu có cấu trúc. Dưới đây là một ví dụ hoàn chỉnh minh họa cách thao tác với các mảng JSON trong Go, bao gồm phân tích, lặp, lọc, sắp xếp, cập nhật, và chuyển đổi trở lại thành JSON.

package main

import (
	"encoding/json"
	"fmt"
	"sort"
)

type User struct {
	Name   string `json:"name"`
	Active bool   `json:"active"`
}

func main() {
	// Mảng JSON mẫu
	jsonStr := `[{"name":"Alice","active":true},{"name":"Bob","active":false},{"name":"Carol","active":true}]`

	// 1. Phân tích chuỗi JSON thành slice của structs
	var users []User
	err := json.Unmarshal([]byte(jsonStr), &users)
	if err != nil {
		panic(err)
	}
	fmt.Println("Người dùng gốc:", users)

	// 2. Lặp qua mảng
	for _, user := range users {
		fmt.Println("Tên người dùng:", user.Name)
	}

	// 3. Lọc người dùng đang hoạt động
	var activeUsers []User
	for _, user := range users {
		if user.Active {
			activeUsers = append(activeUsers, user)
		}
	}
	fmt.Println("Người dùng đang hoạt động:", activeUsers)

	// 4. Sắp xếp người dùng theo tên
	sort.Slice(users, func(i, j int) bool {
		return users[i].Name < users[j].Name
	})
	fmt.Println("Người dùng đã sắp xếp:", users)

	// 5. Thêm một người dùng mới
	users = append(users, User{Name: "Dave", Active: true})
	fmt.Println("Sau khi thêm Dave:", users)

	// 6. Xóa người dùng theo chỉ số (ví dụ: xóa người dùng thứ hai)
	if len(users) > 1 {
		users = append(users[:1], users[2:]...)
	}
	fmt.Println("Sau khi xóa người dùng thứ hai:", users)

	// 7. Tìm người dùng theo tên
	var found *User
	for i := range users {
		if users[i].Name == "Alice" {
			found = &users[i]
			break
		}
	}
	fmt.Println("Tìm thấy người dùng:", found)

	// 8. Cập nhật Bob thành hoạt động nếu tồn tại
	for i := range users {
		if users[i].Name == "Bob" {
			users[i].Active = true
		}
	}

	// 9. Chuyển đổi slice trở lại thành JSON
	updatedJSON, err := json.MarshalIndent(users, "", "  ")
	if err != nil {
		panic(err)
	}
	fmt.Println("JSON đã cập nhật:")
	fmt.Println(string(updatedJSON))
}

Các công cụ trực tuyến hữu ích cho việc làm việc với mảng JSON

1. CodeUtility: Trình xem/Định dạng JSON

  • Tự động định dạng với số dòng.
  • Chuyển đổi giữa chế độ gọn và đẹp.
  • Xác thực tích hợp sẵn.

Liên kết: https://beautifyjson.codeutility.io

2. CodeUtility: JSON sang Yaml

  • Chuyển đổi mảng JSON sang YAML.
  • Lọc hoặc trích xuất các trường của mảng.

Liên kết: https://json2yaml.codeutility.io

3. JSONLint: Trình xác thực JSON

  • Xác thực và định dạng JSON.
  • Kiểm tra xem mảng JSON của bạn có đúng cú pháp không.
  • Tự động thụt lề và làm nổi bật lỗi.

Liên kết: https://jsonlint.com