json - प्रारूप[pscustomobject] इंस्टॉन्शन्स-रेफमेथ या कन्वर्टफ्रॉम-जेसन द्वारा दिए गए उदाहरण




powershell formatting (2)

नेस्टेड ऑब्जेक्ट के लिए प्रॉपर्टी Name रूप में आपको मूल कुंजीनाम को जोड़ना होगा:

$json.Object | ForEach-Object {
  foreach ($p in $_.PSObject.Properties) {
    $p.Value | Select-Object @{n='Name';e={$p.Name}},*
  }
}

ध्यान दें कि PowerShell डिफ़ॉल्ट रूप से सूची रूप में आउटपुट प्रदान करेगा, क्योंकि आपकी ऑब्जेक्ट्स में 4 से अधिक संपत्तियां हैं। Format-List -AutoSize आउटपुट प्राप्त करने के लिए Format-List -AutoSize माध्यम से इसे पाइप करें।

मैं एक रक्षित एपीआई से प्राप्त की जा रही एक JSON फ़ाइल से एक तालिका बनाने की कोशिश कर रहा हूँ।

जब मैं जेसन ऑब्जेक्ट की प्रॉपर्टी मुद्रित करता हूं तो मुझे इस तरह एक आउटपुट मिलता है:

PS> Write-Output JSON.Object

Object1           : @{key1=property; key2=property; key3=property; key4=property}
Object2           : @{key1=property; key2=property; key3=property; key4=property}
Object3           : @{key1=property; key2=property; key3=property; key4=property}
Object4           : @{key1=property; key2=property; key3=property; key4=property}

मैं देखना चाहता हूं कि आउटपुट यह है:

Name              key1        key2        key3        key4
-----             ----        ----        ----        ----
Object1           property    property    property    property
Object2           property    property    property    property
Object3           property    property    property    property

इसके अलावा, क्या यह एक विशिष्ट कुंजी प्रदर्शित करने से बचने के लिए संभव है और यह गुण है?

उदाहरण:

Name              key1        key2        key4      # ← Not displaying key3
-----             ----        ----        ----
Object1           property    property    property
Object2           property    property    property
Object3           property    property    property

पृष्ठभूमि की जानकारी के साथ एन्गर विचर के सुरुचिपूर्ण उत्तर की पूर्ति के लिए :

चलो नमूना इनपुट को परिभाषित करते हैं जो एक एकल, नेस्टेड ऑब्जेक्ट को एक PowerShell [pscustomobject] उदाहरण में [pscustomobject] ConvertFrom-Json [pscustomobject] माध्यम से परिवर्तित कर देता है:

$objFromJson = [pscustomobject] @{ 
  Object1 = [pscustomobject] @{key1='o11'; key2='o12'; key3='o13'; key4='o14'}
  Object2 = [pscustomobject] @{key1='o21'; key2='o22'; key3='o23'; key4='o24'} 
  Object3 = [pscustomobject] @{key1='o31'; key2='o32'; key3='o33'; key4='o34'} 
  Object4 = [pscustomobject] @{key1='o41'; key2='o42'; key3='o43'; key4='o44'} 
  Object5 = [pscustomobject] @{key1='o51'; key2='o52'; key3='o53'; key4='o54'} 
}

$objFromJson आउटपुट देता है जो प्रश्न के रूप में स्वरूपित होता है।

प्रश्न में दिखाए गए आउटपुट स्वरूपण में यह परिणाम क्यों मिलता है?

[pscustomobject] जैसे प्रकारों के लिए, जिनके लिए स्पष्ट रूप से परिभाषित परिभाषाएं नहीं हैं ( *.ps1xml फ़ाइलों के माध्यम से और *.ps1xml रूप से सत्र में लोड किए जाते हैं या स्पष्ट रूप से Update-FormatData *.ps1xml माध्यम से *.ps1xml तय करता है कि किस प्रकार की संख्या के आधार पर उपयोग करने के लिए डिफ़ॉल्ट स्वरूपण प्रकार के गुण :

  • अधिकतम 4 प्रॉपर्टी के साथ एक प्रकार Format-Table का उपयोग करता है
  • 5 या अधिक गुणों के साथ एक प्रकार सम्मिलित रूप से Format-List का उपयोग करता है

सवाल में नमूना इनपुट संभवतः संक्षिप्त किया गया है ; वास्तव में केवल 4 गुणों के साथ, एक सारणीय प्रदर्शन का परिणाम होता।

गुणों को अपने मूल्यों पर .PSObject.ToString() को कॉल करके प्रदान किया जाता है , जो आम तौर पर एक समान प्रतिनिधित्व होता है यदि आप ऑब्जेक्ट को एक डबल-उद्धृत स्ट्रिंग के भीतर संदर्भित करते हैं, सिवाय इसके कि वह हमेशा संस्कृति- अपरिवर्तनीय स्वरूपण का उपयोग करता है, जबकि .ToString() मौजूदा संस्कृति का सम्मान करेंगे, यदि प्रकार का समर्थन करता है।

[pscustomobject] उदाहरण के मामले में, यह एक [pscustomobject] शाब्दिक जैसा एक प्रतिनिधित्व करता है, लेकिन एक पृष्ठभूमि के लिए नहीं है ( यह मेरा जवाब देखें); उदाहरण के लिए:

> $objFromJson.Object1.PSObject.ToString()
@{key1=o11; key2=o12; key3=o13; key4=o14}

वांछित के रूप में डेटा को दोबारा करना:

फॉर्मेटिंग सीएमडीलेट्स का उपयोग करने का कोई तरीका नहीं है जैसे कि Format-Table सीधे वांछित आउटपुट उत्पन्न करने के लिए - पहले डेटा को फिर से नया होना चाहिए:

विशेष रूप से, ऑब्जेक्ट के ऑब्जेक्ट्स $objFromJson को कस्टम ऑब्जेक्ट्स के संग्रह में $objFromJson जाना चाहिए:

  • जिसका Name संपत्ति में किसी दिए गए संपत्ति का नाम है, और

  • जिनकी अन्य गुण संपत्ति के मूल्य के उद्देश्य के गुण हैं; दूसरे शब्दों में: इनपुट गुणों के मूल्य के गुणों को आउटपुट ऑब्जेक्ट के गुणों को ही बनाया जाना चाहिए।

$objFromJson के गुणों को निकालने से PowerShell (दूसरों के बीच) को छिपी .PSObject है। सभी ऑब्जेक्ट्स के लिए .PSObject प्रॉपर्टी, जिनके स्वयं। .Properties प्रॉपर्टी में सभी वस्तु की संपत्ति परिभाषाओं का संग्रह होता है (नाम, मान, अतिरिक्त मेटाडेटा जैसे प्रकार संपत्ति, ...); उदाहरण के लिए:

> $objFromJson.Object1.PSObject.Properties
MemberType      : NoteProperty
IsSettable      : True
IsGettable      : True
Value           : o11
TypeNameOfValue : System.String
Name            : key1
IsInstance      : True
# ... remaining properties

$objFromJson की संपत्ति परिभाषाओं का संग्रह $objFromJson और केवल परिभाषाओं को निकालने ' Name और Value गुण सही दिशा में एक कदम है:

> $objFromJson.PSObject.Properties | Select-Object Name, Value

Name    Value                                    
----    -----                                    
Object1 @{key1=o11; key2=o12; key3=o13; key4=o14}
Object2 @{key1=o21; key2=o22; key3=o23; key4=o24}
Object3 @{key1=o31; key2=o32; key3=o33; key4=o34}
Object4 @{key1=o41; key2=o42; key3=o43; key4=o44}
Object5 @{key1=o51; key2=o52; key3=o53; key4=o54}

हालांकि, हमें संपत्ति-व्यक्तिगत मूल्यों के साथ उत्पादन प्राप्त करने के लिए आउटपुट ऑब्जेक्ट्स के .Value संपत्ति के प्रत्यक्ष गुणों के गुण बनाना चाहिए।

एन्गर के सुरुचिपूर्ण उत्तर में यह दर्शाया गया है कि एक पाइपलाइन में यह कैसे करना है।
मुझे इसे से प्राप्त पुन: उपयोग योग्य सहायक फ़ंक्शन के साथ पूरक बनाते हैं :

function ConvertTo-Collection($InputObject) {
  foreach ($obj in $InputObject) {
    foreach ($prop in $obj.PSObject.Properties) {
      $prop.Value | Select-Object @{ n='Name'; e={ $prop.Name }}, *
    }
  } 
}

उस समारोह के साथ, वांछित उत्पादन अब इस प्रकार प्राप्त किया जा सकता है:

ConvertTo-Collection $objFromJson | Format-Table

एक विशिष्ट संपत्ति को बाहर करने के लिए, जैसे कि 3 key3 :

ConvertTo-Collection $objFromJson | Select-Object -ExcludeProperty key3 | Format-Table




output-formatting