PowerShell cung cấp một bộ lệnh mạnh mẽ để xử lý dữ liệu dạng JSON, và lệnh ConvertTo-Json PowerShell là một trong những công cụ quan trọng nhất. Lệnh này cho phép bạn chuyển đổi các đối tượng PowerShell (objects, arrays, hashtables) thành chuỗi JSON một cách nhanh chóng và linh hoạt. Bài viết này sẽ đi sâu vào từng khía cạnh của lệnh convertto-json powershell, từ cú pháp cơ bản, tham số, các trường hợp sử dụng thực tế cho đến những lưu ý quan trọng giúp bạn khai thác tối đa sức mạnh của nó.
Giới thiệu tổng quan về lệnh ConvertTo-Json trong PowerShell

ConvertTo-Json là một cmdlet thuộc module Microsoft.PowerShell.Utility, có mặt trong tất cả các phiên bản PowerShell từ 3.0 trở lên. Chức năng chính của nó là chuyển đổi một đối tượng PowerShell thành chuỗi JSON, giúp bạn dễ dàng xuất dữ liệu ra file, gửi qua REST API, hoặc lưu trữ dưới dạng cấu trúc có thể đọc được bởi các ngôn ngữ lập trình khác. Việc sử dụng lệnh convertto-json powershell đặc biệt hữu ích khi làm việc với các dịch vụ web, log hệ thống, hoặc khi cần chuyển đổi dữ liệu giữa các ứng dụng.
Khác với định dạng XML hay CSV, JSON (JavaScript Object Notation) có cấu trúc nhẹ, dễ đọc và hỗ trợ các kiểu dữ liệu phức tạp như nested objects, arrays. PowerShell tích hợp sẵn khả năng serialization/deserialization JSON thông qua các lệnh ConvertTo-Json và ConvertFrom-Json. Lệnh này biến những đối tượng PowerShell phức tạp thành văn bản thuần túy, có thể được lưu, gửi, hoặc xử lý bởi bất kỳ công cụ nào hiểu JSON.
Cú pháp và tham số của lệnh ConvertTo-Json PowerShell
Để hiểu rõ lệnh convertto-json powershell, trước tiên cần nắm vững cú pháp và các tham số quan trọng của nó. Tham số này thường được pipe trực tiếp vào lệnh.
- -Depth: Xác định độ sâu tối đa của nested objects mà lệnh sẽ tuần tự hóa. Mặc định là
2. Nếu đối tượng có cấu trúc lồng nhau vượt quá Depth, các thuộc tính con sẽ bị cắt bỏ và thay bằng giá trị null hoặc chuỗi rỗng. - -Compress: Loại bỏ khoảng trắng, xuống dòng, tạo chuỗi JSON nén, phù hợp khi truyền dữ liệu qua mạng để giảm băng thông.
- -EnumsAsStrings: Chuyển đổi các giá trị enum thành tên string thay vì số nguyên. Giúp JSON dễ đọc hơn, đặc biệt khi enum có ý nghĩa rõ ràng.
- -AsArray: Luôn xuất kết quả dưới dạng mảng JSON, ngay cả khi InputObject chỉ có một phần tử. Hữu ích khi bạn muốn đảm bảo đầu ra luôn là array.
- -EscapeHandling: Kiểm soát cách xử lý ký tự đặc biệt (escape). Giá trị mặc định là Default, ngoài ra còn có EscapeNonAscii, EscapeHtml.
Ví dụ cơ bản nhất:
Get-Process | Select-Object -First 3 Name,Id,CPU | ConvertTo-Json
Kết quả là một chuỗi JSON chứa mảng 3 process với các thuộc tính Name, Id, CPU.
Giải thích chi tiết: Lệnh convertto-json powershell hoạt động như thế nào

Lệnh convertto-json powershell thực hiện quá trình serialization, tức là chuyển đổi trạng thái của đối tượng trong bộ nhớ thành một định dạng có thể lưu trữ hoặc truyền tải. PowerShell sử dụng một bộ chuyển đổi nội bộ để duyệt qua các thuộc tính public của đối tượng, biến chúng thành các cặp key-value trong JSON. Các kiểu dữ liệu cơ bản (string, number, boolean, null) được ánh xạ trực tiếp. Các kiểu phức tạp (array, hashtable, PSCustomObject) được chuyển thành mảng hoặc đối tượng lồng nhau.
Một điểm quan trọng là lệnh không duyệt toàn bộ đồ thị đối tượng vô hạn. Tham số -Depth giới hạn số cấp độ nested. Nếu đối tượng có vòng lặp tham chiếu (circular reference), lệnh sẽ báo lỗi hoặc xử lý theo cách riêng (từ PowerShell 6 trở lên có xử lý tốt hơn).
So sánh với ConvertFrom-Json
| Tính năng | ConvertTo-Json | ConvertFrom-Json |
|---|---|---|
| Hướng chuyển đổi | Object PowerShell → chuỗi JSON | Chuỗi JSON → Object PowerShell |
| Ứng dụng chính | Xuất dữ liệu, giao tiếp API | Nhập dữ liệu, đọc cấu hình |
| Tham số Depth | Có, giới hạn độ sâu xuất | Không (tự động parse toàn bộ) |
| Compress | Có | Không (chuỗi nén vẫn parse được) |
Hướng dẫn sử dụng lệnh ConvertTo-Json PowerShell chi tiết
Chuyển đổi một đối tượng đơn giản
Giả sử bạn có một hashtable chứa thông tin người dùng:
$user = @{Name="Nguyen Van A"; Age=30; Role="Admin"}
$user | ConvertTo-Json
Kết quả:
{ "Name": "Nguyen Van A", "Age": 30, "Role": "Admin"
}
Chuyển đổi mảng các đối tượng
Get-Service -Name "Spooler","W32Time" | Select-Object Name,Status | ConvertTo-Json
Mảng JSON chứa mỗi service là một object.
Sử dụng tham số -Depth
Khi đối tượng có cấu trúc lồng nhau sâu, ví dụ như thông tin máy tính với nhiều cấp. Nếu không chỉ định Depth, chỉ 2 cấp đầu được giữ lại.
Get-ComputerInfo | ConvertTo-Json -Depth 5
Nên đặt Depth đủ lớn (ví dụ 10) nếu bạn cần toàn bộ dữ liệu, nhưng lưu ý output sẽ rất dài.
Sử dụng tham số -Compress để tạo JSON nén
$data = @{users=@(@{id=1; name="A"},@{id=2; name="B"})}
$data | ConvertTo-Json -Compress
Kết quả là một dòng duy nhất: {"users":[{"id":1,"name":"A"},{"id":2,"name":"B"}]}
Rất hữu ích khi gửi qua HTTP request để giảm dung lượng.
Tham số -AsArray
Khi bạn muốn đảm bảo đầu ra luôn là mảng, ngay cả khi chỉ có một phần tử:
Get-Process -Id $pid | ConvertTo-Json -AsArray
Kết quả bắt đầu bằng dấu [ mặc dù chỉ có một process.
Tham số -EnumsAsStrings
Ví dụ với ServiceControllerStatus là enum:
Get-Service Spooler | Select-Object Name,Status | ConvertTo-Json -EnumsAsStrings
Status sẽ hiển thị “Running” thay vì 4.
Ứng dụng thực tế của lệnh convertto-json powershell

Lệnh convertto-json powershell được sử dụng rộng rãi trong các kịch bản quản trị hệ thống, phát triển tự động hóa và tích hợp dữ liệu.
Xuất dữ liệu ra file JSON để lưu trữ hoặc trao đổi
Get-Process | Select-Object Name,Id,CPU,WorkingSet | ConvertTo-Json -Depth 3 | Out-File -FilePath ".process.json"
File JSON thu được có thể dùng làm input cho các ứng dụng khác, hoặc lưu làm snapshot.
Gửi dữ liệu lên REST API
Với Invoke-RestMethod, bạn cần body dạng JSON:
$body = @{username="admin"; password="secret"} | ConvertTo-Json -Compress
Invoke-RestMethod -Uri "https://api.example.com/login" -Method Post -Body $body -ContentType "application/json"
Xây dựng báo cáo dạng JSON cho hệ thống giám sát
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object DeviceID,Size,FreeSpace | ConvertTo-Json -Depth 1 | Add-Content -Path ".disk_report.json"
Kết hợp với ConvertFrom-Json để xử lý dữ liệu đầu ra
Có thể bạn cần đọc file JSON, chỉnh sửa rồi ghi lại:
$obj = Get-Content "config.json" | ConvertFrom-Json
$obj.Setting = "new value"
$obj | ConvertTo-Json -Depth 10 | Set-Content "config.json"
Sai lầm thường gặp khi sử dụng lệnh ConvertTo-Json PowerShell
- Không chỉ định Depth phù hợp: Mặc định Depth là 2, nếu đối tượng có nested object sâu hơn, dữ liệu sẽ bị cắt. Hãy luôn kiểm tra output và tăng Depth nếu cần.
- Sử dụng -Compress khi debug: Khi gỡ lỗi, nên bỏ -Compress để có JSON dễ đọc, giúp phát hiện lỗi cấu trúc.
- Nhầm lẫn giữa ConvertTo-Json và Out-File:
ConvertTo-Jsontạo ra chuỗi, cần kết hợp vớiOut-FilehoặcSet-Contentđể ghi file. DùngConvertTo-Json | Set-Content file.jsonthay vìConvertTo-Json file.json. - Quên xử lý circular reference: Với các đối tượng có tham chiếu vòng, lệnh có thể báo lỗi. Hãy sử dụng
Select-Objectđể lọc chỉ các thuộc tính cần thiết, hoặc dùng PowerShell 7+ có cải thiện. - Không dùng -EnumsAsStrings khi cần JSON dễ đọc: Các giá trị enum dạng số khó hiểu, nên chuyển sang string để tăng khả năng con người đọc hiểu.
Lưu ý quan trọng khi làm việc với lệnh convertto-json powershell

- Kiểm tra phiên bản PowerShell: Trong PowerShell 5.1 trở xuống, ConvertTo-Json nằm trong module Microsoft.PowerShell.Utility. PowerShell Core (6+) có sẵn và có thêm tham số -EscapeHandling.
- Xử lý các kiểu dữ liệu đặc biệt: Đối tượng DateTime được chuyển thành chuỗi ISO 8601. Các đối tượng ScriptBlock, PSReference, hoặc các giá trị $null được xử lý cụ thể. Hãy test với dữ liệu thật của bạn.
- Bảo mật thông tin nhạy cảm: Khi xuất JSON chứa mật khẩu, token, hãy đảm bảo file được bảo vệ đúng cách.
- Không dùng ConvertTo-Json với lượng dữ liệu quá lớn: Việc chuyển đổi hàng triệu đối tượng có thể làm tràn bộ nhớ. Hãy xử lý từng phần hoặc sử dụng streaming với
ForEach-Object.
So sánh lệnh ConvertTo-Json với các cách tạo JSON khác
| Phương pháp | Ưu điểm | Nhược điểm |
|---|---|---|
| ConvertTo-Json | Nhanh, tích hợp sẵn, dễ dùng với pipeline, nhiều tham số tùy chỉnh. | Depth mặc định thấp, không hỗ trợ template. |
| Dùng string builder tự ghép | Kiểm soát hoàn toàn định dạng, tránh lỗi depth. | Mệt mỏi, dễ sai cú pháp, khó bảo trì. |
| Export-Clixml | Bảo toàn toàn bộ đối tượng và kiểu dữ liệu. | Chỉ đọc được bằng PowerShell, output lớn hơn JSON nhiều. |
| Thư viện bên ngoài (Newtonsoft.Json) | Rất linh hoạt, nhiều tính năng. | Phải tải và load assembly, làm chậm script. |
Câu hỏi thường gặp (FAQ) về lệnh convertto-json powershell

Làm thế nào để xuất JSON với định dạng đẹp (pretty print)?
Mặc định ConvertTo-Json đã xuất đẹp (có thụt đầu dòng và xuống dòng). Nếu bạn muốn đẹp hơn hoặc thay đổi indent, hãy dùng ConvertTo-Json | Set-Content rồi mở file. Để ép định dạng đẹp sau khi nén,
Nguyên nhân phổ biến là do tham số -Depth quá nhỏ. Hãy tăng Depth lên, ví dụ 10. Một lý do khác là đối tượng có thuộc tính chỉ có getter mà không có dữ liệu, hoặc thuộc tính kiểu ScriptMethod không thể serialized.
Có thể chuyển đổi array trực tiếp không?
Có. Pipe một array vào ConvertTo-Json, nó sẽ xuất mảng JSON. Nếu array rỗng, kết quả là [].
Làm sao để xuất JSON không bị escape các ký tự Unicode?
Trong PowerShell Core,
Bạn có thể dùng $json | ConvertFrom-Json -ErrorAction Stop để kiểm tra lỗi cú pháp. Nếu không có lỗi, JSON hợp lệ.
Kết luận
Lệnh convertto-json powershell là một công cụ không thể thiếu trong tủ đồ của bất kỳ admin PowerShell nào. Nó giúp bạn xuất dữ liệu một cách chuyên nghiệp, dễ dàng tích hợp với các hệ thống hiện đại. Qua bài viết này, bạn đã hiểu rõ cú pháp, các tham số, cách sử dụng trong thực tế cũng như những sai lầm cần tránh. Hãy thực hành với dữ liệu thật của bạn, điều chỉnh Depth và Compress phù hợp, và luôn kiểm tra output bằng ConvertFrom-Json để đảm bảo chất lượng. Việc thành thạo lệnh convertto-json powershell sẽ nâng cao hiệu suất làm việc của bạn với các tác vụ tự động hóa và xử lý dữ liệu trong môi trường Windows và cross-platform.







