Как я могу преобразовать hastable в строку json в powershell? - PullRequest
5 голосов
/ 07 декабря 2011

Я пытаюсь преобразовать хеш-таблицу в объект json для использования в веб-службе с powershell 2.0.

$testhash = @{
    Name = 'John Doe'
    Age = 10
    Amount = 10.1
    MixedItems = (1,2,3,"a")
    NestedHash = @{
        nestedkey = "nextedvalue"
    }
}

function toJson($obj){

    $ms = New-Object IO.MemoryStream
    $type = $obj.getType()
    [Type[]]$types = ($obj | select -expand PsTypeNames |  Select -unique) + [type]'System.Management.Automation.PSObject'
    $js = New-Object System.Runtime.Serialization.Json.DataContractJsonSerializer $type, $types, ([int]::MaxValue), $false, $null, $false
    $js.writeObject($ms, $obj) | out-null
    $utf8.GetString( $ms.ToArray(), 0, $ms.Length )
    $ms.Dispose() | out-null
}

toJson $testhash
'[{"Key":"Name","Value":"John Doe"},{"Key":"Age","Value":10},{"Key":"Amount","Value":10.1},{"Key":"NestedHash","Value":[{"__type":"KeyValuePairOfanyTypeanyType:#System.Collections.Generic","key":"nestedkey","value":"nextedvalue"}]},{"Key":"MixedItems","Value":[1,2,3,"a"]}]'

Я использую DataContractJsonSerializer конструктор таким образом, чтобыдолжен подавлять информацию о типе, но это явно не так.Я также удивлен тем, что он извлекает пары ключ и значение, но я бы хотел, чтобы это тоже не делалось.Что я делаю не так?

Ответы [ 3 ]

16 голосов
/ 07 декабря 2011

Хорошо, поэтому manojlds ответил за v2, поэтому я просто добавлю эквивалент v3:

PS> @{name="oisin"; age=37} | convertto-json
{
    "age":  37,
    "name":  "oisin"
}

Чуть чище, верно?

PowerShell 3.0 CTP2: http://www.microsoft.com/download/en/details.aspx?id=27548

3 голосов
/ 07 декабря 2011

Я адаптировал скрипт из здесь , как показано ниже:

$testhash = @{
    Name = 'John Doe'
    Age = 10
    Amount = 10.1
    MixedItems = (1,2,3,"a")
    NestedHash = @{
        nestedkey = "nextedvalue"
    }
}

function Read-Stream {
PARAM(
   [Parameter(Position=0,ValueFromPipeline=$true)]$Stream
)
process {
   $bytes = $Stream.ToArray()
   [System.Text.Encoding]::UTF8.GetString($bytes,0,$bytes.Length)
}}

function New-Json {
[CmdletBinding()]
param([Parameter(ValueFromPipeline=$true)][HashTable]$InputObject) 
begin { 
   $ser = @{}
   $jsona = @()
}
process {
   $jsoni = 
   foreach($input in $InputObject.GetEnumerator() | Where { $_.Value } ) {
      if($input.Value -is [Hashtable]) {
         '"'+$input.Key+'": ' + (New-JSon $input.Value)
      } else {
         $type = $input.Value.GetType()
         if(!$Ser.ContainsKey($Type)) {
            $Ser.($Type) = New-Object System.Runtime.Serialization.Json.DataContractJsonSerializer $type
         }
         $stream = New-Object System.IO.MemoryStream
         $Ser.($Type).WriteObject( $stream, $Input.Value )
         '"'+$input.Key+'": ' + (Read-Stream $stream)
      }
   }

   $jsona += "{`n" +($jsoni -join ",`n")+ "`n}"
}
end { 
   if($jsona.Count -gt 1) {
      "[$($jsona -join ",`n")]" 
   } else {
      $jsona
   }
}}

$testHash | New-Json
0 голосов
/ 30 октября 2018

Хороший чистый однострочный.

ConvertTo-Json ([System.Management.Automatio.PSObject] $testhash)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...