Câu hỏi Cách kiểm tra xem tệp có cú pháp JSON hợp lệ trong Powershell không


Tôi đang cố gắng viết một kịch bản PowerShell mà đọc một tập tin và in "true" nếu nó là một tệp JSON hợp lệ. Tôi đang sử dụng Powershell v3.0 và đây là những gì tôi có ngay bây giờ:

$text = Get-Content .\filename.txt -Raw 
$powershellRepresentation = $text | ConvertFrom-Json

Làm cách nào để kiểm tra mã trả lại? Ý tôi là tôi muốn một cái gì đó như thế này:

if(file not a JSON file){
 Write-Host "not JSON"
}
else{
 Write-Host "True"
}

7
2018-06-11 00:44


gốc


Tôi có thể làm điều đó bằng cách bắt ngoại lệ. Nhưng có cách nào khác không? - Pulkit


Các câu trả lời:


Không có Test-Json như cmdlet, vì vậy cách tốt nhất là đặt ConvertFrom-Json cmdlet bên trong một try ... catch khối

try {
    $powershellRepresentation = ConvertFrom-Json $text -ErrorAction Stop;
    $validJson = $true;
} catch {
    $validJson = $false;
}

if ($validJson) {
    Write-Host "Provided text has been correctly parsed to JSON";
} else {
    Write-Host "Provided text is not a valid JSON string";
}

9
2018-06-18 13:54



cảm ơn! Tôi đoán khối try-catch là lựa chọn duy nhất. - Pulkit
cứu cuộc đời tôi. cố gắng tìm ra một vấn đề mà PS4 không chuyển đổi JSON thành PSObject bằng invoke-restMethod. bạn giành chiến thắng trên internet. - Chaim Eliyah
Thật không may, {"a": 1, "a": 2} vượt qua kiểm tra này trong khi nó có các khóa thuộc tính trùng lặp. Hầu hết các trình phân tích cú pháp không phàn nàn và thường xem xét thuộc tính mới nhất .. Tuy nhiên, chắc chắn có một vấn đề. - Myobis


Tôi không nghĩ rằng nó tồn tại một giải pháp khác hơn là bắt ngoại lệ bằng cách sử dụng ConvertFrom-Json.


1
2018-06-11 11:27





ConvertFrom-JSON sẽ hoạt động nhưng chỉ cho một đối tượng JSON có kích thước <2MB. Để cao hơn, bạn có thể sử dụng lớp JavaScriptSerializer

try
{
    $jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
    $jsser.MaxJsonLength = $jsser.MaxJsonLength * 10
    $jsser.RecursionLimit = 99    

    $outObject = $jsser.DeserializeObject($json)
}
catch
{
    Write-Host "Error converting $text to JSON"
}

0
2017-09-24 09:13