2015-03-27 71 views
9

Tôi đang viết kịch bản để thực hiện thay đổi đối với tệp JSON nhưng khi tệp được chuyển đổi thành JSON, nó mở rộng các ký tự đặc biệt.PowerShell: ConvertTo-Json problen chứa các ký tự đặc biệt

Ví dụ: Tệp JSON chứa mật khẩu với "&". Cách nhanh chóng để tái tạo sự cố là sử dụng lệnh sau:

PS> "Mật khẩu & 123" | ConvertTo-Json đầu ra là: "Mật khẩu \ u0026123"

##Here is how I import the JSON FILE: 
$jsonfile = (Get-Content .\example.json -Encoding Ascii) -join "`n" | ConvertFrom-Json 
##Exporting JSON FILE without modifying it. 
$jsonfile | ConvertTo-Json |Out-File "new.json" 

--here là một ví dụ về JSON đơn giản FILE

{ 
    "Server1": 
    { 
     "username":"root", 
     "password":"Password&dfdf" 
    }, 
    "Server2": 
    { 
     "username":"admin", 
     "password":"Password&1234" 
    } 
} 

Trả lời

2

này được gây ra bởi tính năng nhân vật thoát tự động Convertto-Json và nó ảnh hưởng một số biểu tượng như <>\'&

ConvertFrom-Json sẽ đọc các ký tự thoát đúng cách. Sử dụng ví dụ của bạn:

PS C:\> {"Password\u0026123"} | ConvertFrom-Json 
Password&123 

Và kết quả mã ví dụ của bạn trong một tập tin đó đã trốn thoát ký tự, nhưng ConvertFrom-Json có thể đọc nó trở lại mật khẩu gốc. Xem bên dưới:

PS C:\> (Get-Content .\example.json -Encoding Ascii) -join "`n" | ConvertFrom-Json 
Server1         Server2 
-------         ------- 
@{username=root; password=Password&dfdf} @{username=admin; password=Password&1234} 

PS C:\> (Get-Content .\new.json -Encoding Ascii) -join "`n" | ConvertFrom-Json 
Server1         Server2 
-------         ------- 
@{username=root; password=Password&dfdf} @{username=admin; password=Password&1234} 

Nếu bạn cần mật khẩu được lưu trữ không thoát, có thể cần một số công việc quan trọng hơn. Xem chủ đề này về Converting Unicode strings to escaped ascii strings

Cách khác, tránh các ký tự bị ảnh hưởng nếu có thể.

+0

Cảm ơn! Tôi nghĩ rằng tôi sẽ làm việc trên một cái gì đó để chuyển đổi mật khẩu sau khi chuyển đổi-json của nó ... Sẽ cập nhật ngay sau khi tôi nhận được một cái gì đó ... – Maki

+0

Tôi chỉ đọc lại bài viết của bạn và nhận ra nó không phải là một vấn đề thực sự nữa. Hóa ra là một vấn đề về mỹ phẩm hiện nay. Thậm chí nghĩ rằng mật khẩu là unicode, Nó hoạt động .. Vì vậy, tôi sẽ không phải lo lắng về việc chuyển đổi nó ngay bây giờ .. – Maki

15

Thử) phương pháp unescape (:

$jsonfile | ConvertTo-Json | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Out-File "new.json" 
+2

Cảnh báo: điều này loại bỏ TẤT CẢ thoát, bao gồm một số có thể cần thiết trong JSON của bạn, ví dụ: ký tự trích dẫn thoát: '" biểu thức ":" Tên tôi là \ "joe \" "'. Điều này khiến bạn bị hỏng JSON ... –

Các vấn đề liên quan