2014-05-18 37 views
12

Tôi muốn thêm nội dung nào đó vào JSON được phân tích cú pháp của mình bằng PowerShell. Mã của tôi:PowerShell cách thêm nội dung nào đó vào JSON được phân tích cú pháp?

function ConvertFromJson([string]$file) 
{ 
    [System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions") 
    $jsoncontent = Get-Content $file 
    $jsonobj = New-Object System.Web.Script.Serialization.JavaScriptSerializer 
    $global:json = $jsonobj.DeserializeObject($jsoncontent) 
} 

JSON của tôi:

{ 
    "BlockA": { 
    "BlockB": { 
     "name": "BlockB", 
     "value": "Value_B" 
    }, 
} 

Tôi muốn làm BlockC như thế này:

{ 
    "BlockA": { 
    "BlockB": { 
     "name": "BlockB", 
     "value": "Value_B" 
    }, 
    "BlockC": { 
     "name": "BlockC", 
     "value": "Value_C" 
    }, 
} 

tôi đã cố gắng

$json.BlockA.Add("BlockC", "") 

$json.BlockA.BlockC.Add("name", "BlockC") 

nhưng nó không làm việc với các lỗi:

there is no add method

Tôi thử tất cả tôi có thể làm (cố gắng Thêm Method, sử dụng Add-thành viên), nhưng đều thất bại.

đã thêm: PS C: \ Users \ Develop7> $ json.BlockA.BlockC | Get-Thành viên

TypeName: System.String 

Name    MemberType   Definition 
----    ----------   ---------- 
Clone   Method    System.Object Clone() 
CompareTo  Method    int CompareTo(System.Object value), int CompareTo(string strB) 
Contains   Method    bool Contains(string value) 
CopyTo   Method    System.Void CopyTo(int sourceIndex, char[] destination, int destinationIndex,... 
EndsWith   Method    bool EndsWith(string value), bool EndsWith(string value, System.StringCompari... 
Equals   Method    bool Equals(System.Object obj), bool Equals(string value), bool Equals(string... 
GetEnumerator Method    System.CharEnumerator GetEnumerator() 
GetHashCode  Method    int GetHashCode() 
GetType   Method    type GetType() 
GetTypeCode  Method    System.TypeCode GetTypeCode() 
IndexOf   Method    int IndexOf(char value), int IndexOf(char value, int startIndex), int IndexOf... 
IndexOfAny  Method    int IndexOfAny(char[] anyOf), int IndexOfAny(char[] anyOf, int startIndex), i... 
Insert   Method    string Insert(int startIndex, string value) 
IsNormalized  Method    bool IsNormalized(), bool IsNormalized(System.Text.NormalizationForm normaliz... 
LastIndexOf  Method    int LastIndexOf(char value), int LastIndexOf(char value, int startIndex), int... 
LastIndexOfAny Method    int LastIndexOfAny(char[] anyOf), int LastIndexOfAny(char[] anyOf, int startI... 
Normalize  Method    string Normalize(), string Normalize(System.Text.NormalizationForm normalizat... 
PadLeft   Method    string PadLeft(int totalWidth), string PadLeft(int totalWidth, char paddingChar) 
PadRight   Method    string PadRight(int totalWidth), string PadRight(int totalWidth, char padding... 
Remove   Method    string Remove(int startIndex, int count), string Remove(int startIndex) 
Replace   Method    string Replace(char oldChar, char newChar), string Replace(string oldValue, s... 
Split   Method    string[] Split(Params char[] separator), string[] Split(char[] separator, int... 
StartsWith  Method    bool StartsWith(string value), bool StartsWith(string value, System.StringCom... 
Substring  Method    string Substring(int startIndex), string Substring(int startIndex, int length) 
ToCharArray  Method    char[] ToCharArray(), char[] ToCharArray(int startIndex, int length) 
ToLower   Method    string ToLower(), string ToLower(System.Globalization.CultureInfo culture) 
ToLowerInvariant Method    string ToLowerInvariant() 
ToString   Method    string ToString(), string ToString(System.IFormatProvider provider) 
ToUpper   Method    string ToUpper(), string ToUpper(System.Globalization.CultureInfo culture) 
ToUpperInvariant Method    string ToUpperInvariant() 
Trim    Method    string Trim(Params char[] trimChars), string Trim() 
TrimEnd   Method    string TrimEnd(Params char[] trimChars) 
TrimStart  Method    string TrimStart(Params char[] trimChars) 
Chars   ParameterizedProperty char Chars(int index) {get;} 
Length   Property    System.Int32 Length {get;} 
+0

Bạn đang sử dụng phiên bản Powershell nào? – manojlds

Trả lời

19

Nếu bạn đang sử dụng PowerShell 3.0/4.0 bạn có thể đơn giản hóa chuyển đổi của bạn bằng cách sử dụng ConvertFrom-Json cmdlet.

Ngoài ra, nếu bạn có PS hoặc .Net Kiểu đối tượng, lệnh ghép ngắn Thêm thành viên cho phép bạn thêm thuộc tính tùy ý. Phần sau đây cho biết cách thêm thuộc tính dựa trên khối Json:

$json = @" 
{ 
    "BlockA": { 
    "BlockB": { 
     "name": "BlockB", 
     "value": "Value_B" 
    } 
    } 
} 
"@ 

$blockcvalue [email protected]" 
    { 
    "name":"BlockC", 
    "value":"ValueC" 
    } 
"@ 

$jobj = ConvertFrom-Json -InputObject $json 

$jobj.BlockA | add-member -Name "BlockC" -value (Convertfrom-Json $blockcvalue) -MemberType NoteProperty 

write-host (ConvertTo-Json $jobj) 
0

Bạn nhận được lỗi rằng vì $ json của bạn thực sự là một bộ sưu tập của hai đối tượng. Một trong số đó là một hội đồng và người kia là một cuốn từ điển. Đầu ra ống từ đường tải lắp ráp đến Out-Null để tránh điều đó. Ví dụ:

function ConvertFrom-Json([String]$sRawJson) { 
    [System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions") ` 
     | Out-Null 
    $oJsSerializer = ` 
     New-Object System.Web.Script.Serialization.JavaScriptSerializer 

    return $oJsSerializer.DeserializeObject($sRawJson) 
} 

$sBaseContent = @" 
{ 
    "BlockA": { 
     "BlockB": { 
      "name": "BlockB", 
      "value": "Value_B" 
     } 
    } 
} 
"@ 

$sBlockcContent = @" 
{ 
    "name": "BlockC", 
    "value": "Value_C" 
} 
"@ 

$jsonBaseObj = ConvertFrom-Json($sBaseContent) 
$jsonBlockcObj = ConvertFrom-Json($sBlockcContent) 

$jsonBaseObj.BlockA.Add("BlockC", $jsonBlockcObj) 
$jsonBaseObj 
Các vấn đề liên quan