2015-06-19 9 views
6

एक REST API का उपयोग करने के लिए, मैं एक JSON वस्तु है कि इस तरह दिखता है गुजरना होगा। मैं इसे पुन: उत्पन्न नहीं कर सकता। यहाँनेस्टेड सरणियों और ConvertTo-Json

[int][double]$unixtime=get-date ((get-date).ToUniversalTime()) -UFormat %s 
[email protected]{} 
[email protected]{} 
[email protected]() 
[email protected]() 
$value=get-random -Minimum 0 -Maximum 100 


$series.add("metric","custom.powershell.gauge") 
[email protected](@($unixtime, $value)) 
$series.add("points",$points) 
$obj.Add("series",@($series)) 

$json=$obj | ConvertTo-Json -Depth 30 -Compress 
$json 

और उत्पादन होता है: यहाँ मेरी कोड है

{"series":[{"points":[1434685292,95],"metric":"custom.powershell.gauge"}]} 

मैं बहुत सी बातें की कोशिश की है, मैं 2 सरणियों नेस्ट करने के लिए नहीं किया जा सकता है, यह हमेशा अंत में एक भी की तरह लग रही सरणी।

एक ही नोट पर, किसी को समझाने आया यह करें:

> $a=(1,2) 
> $a 
1 
2 
> $a | ConvertTo-Json 
[ 
    1, 
    2 
] 
> $b=($a,$a) 
> $b 
1 
2 
1 
2 
> $b | ConvertTo-Json 
[ 
    { 
     "value": [ 
         1, 
         2 
        ], 
     "Count": 2 
    }, 
    { 
     "value": [ 
         1, 
         2 
        ], 
     "Count": 2 
    } 
] 

इन value और Count कहाँ से आ रहे हैं?

आपकी मदद के लिए धन्यवाद।

उत्तर

9

व्याख्या यह है कि (1,2),(3,4) सरणी की एक सरणी है, लेकिन Powershell पाइप | साथ प्रथम स्तर अलग हो गए, और आप इन सरणियों के लिए एक नाम देना नहीं है तो serializer यह आपूर्ति करती है।

# First build your array of array 
$z = (1,2),(3,4) 
# convert it to JSON using the , 
,$z | ConvertTo-Json -Depth 5 -Compress 
[psobject]@{"points"=$z} | ConvertTo-Json -Depth 5 -Compress 

यह पहला कदम देता है::

{"value":[[1,2],[3,4]],"Count":2} 
{"points":[[1,2],[3,4]]} 

अब समाधान मैं का प्रस्ताव: सबसे पहले यह करने के लिए एक कोशिश है मेरे लिए

# First build your array of array 
$z = (1,2),(3,4) 

# Then build a PSCustom object 
$a = [pscustomobject]@{"series" = ,@{"metric"="custom.powershell.gauge"; "points"=$z}} 

# At the end convert it to JSON 
# don't forget the **Depth** parameter (use **Compress** to retreive one line like above) 
$a | ConvertTo-Json -Depth 5 

यह के करीब कुछ देता है क्या आपको चाहिए:

{ 
    "series": [ 
        { 
         "points": [ 
             [ 
              1, 
              2 
             ], 
             [ 
              3, 
              4 
             ] 
            ], 
         "metric": "custom.powershell.gauge" 
        } 
       ] 
} 
+0

अल्पविराम ऑपरेटर भी एक नेस्टेड सरणी के साथ काम करता है: '$ points =, @ ($ unixtime, $ value)' –

+0

धन्यवाद! मैं उसके साथ खेलूँगा और धागे को अपडेट करूंगा। – simsaull

+0

पैरामीटर परिभाषा से लिंक करें: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/convertto-json#-depth –

1

जेपीब्लैंक ने सुझाव दिया, एक कस्टम ऑब्जेक्ट बनाने का काम किया।

[long]$value=Get-Random -Minimum 0 -Maximum 100 
$points=,@($unixtime, $value) 
$metricname="custom.powershell.gauge" 

$obj = [pscustomobject]@{"series" = ,@{"metric" = $metricname; "points"=$points}} 

$json=$obj | ConvertTo-Json -Depth 5 -Compress 

कौन सा आउटपुट:

{"series":[{"points":[[1434810163,53]],"metric":"custom.powershell.gauge"}]} 

गहराई> 2 निर्दिष्ट करने के लिए मत भूलना नीचे मेरी कोड है।

धन्यवाद!

2

पार्टी के लिए देर हो चुकी है, लेकिन मैं एक और अधिक दृष्टि से सहज समाधान का प्रस्ताव देना चाहता हूं जो विस्तार करना आसान है (मैं, दूसरों की तरह, एक दृश्य शिक्षार्थी हूं, इसलिए नीचे दिए गए कोड ब्लॉक मुझे चीजों को और आसानी से समझने में मदद करते हैं):

[int][double]$unixtime = Get-Date ((Get-Date).ToUniversalTime()) -UFormat %s 
$value = Get-Random -Minimum 0 -Maximum 100 
$body = @{ 
    'series' = @(
     [Ordered]@{ 
      'metric'='custom.powershell.gauge' 
      'points' = @(
       ,@($unixtime,$value) 
      ) 
     } 
    ) 
} 
ConvertTo-Json -InputObject $body -Depth 4 

आउटपुट:

{ 
    "series": [ 
        { 
         "metric": "custom.powershell.gauge", 
         "points": [ 
             [ 
              1473698742, 
              96 
             ] 
            ] 
        } 
       ] 
} 

-Depth 4 आप अपनी बात मूल्यों के आसपास वर्ग कोष्ठक के अतिरिक्त सेट हो जाता है, और [Ordered] सुनिश्चित करता है कि hashtable के रूप में मूल रूप से निर्दिष्ट आदेश दिया है। भेजने से पहले -Compress को मत भूलना, जैसा कि दूसरों ने कहा है।

संबंधित मुद्दे