2016-12-09 2 views
0

Это является продолжением до this questionPowerShell предотвратить дублирование ключей объектов

Если у меня есть 2 JSon файлы

file1.json

{ 
    "foo": { 
    "honk": 42 
    } 
} 

file2.json

{ 
    "foo": { 
    "honk": 9000, 
    "toot": 9000 
    } 
} 

И Я создаю объект, используя ConvertFrom-Json

$bar = @(Get-ChildItem . -Filter *.json -Recurse | Get-Content -Raw |ConvertFrom-Json) 

Powershell с радостью возьмет оба и перезапишет foo.

foo 

--- 
@{honk=42} 
@{honk=9000; toot=9000} 

Содержание $ bar.foo слиты

$bar.foo 

honk 
---- 
    42 
9000 

Как я могу ошибку, если импортировать повторяющиеся объекты?

ответ

2

Каждый файл JSON импортируется как отдельный объект, поэтому ничего не перезаписывается. Вы просто получаете список объектов.

Чтобы выбросить ошибку, когда вы получаете несколько объектов с одним и тем же свойством верхнего уровня, вы можете группировать объекты по имени свойства и вызывать ошибку, если вы получите счетчик> 1.

$bar | Group-Object { $_.PSObject.Properties.Name } | 
    Where-Object { $_.Count -gt 1 } | 
    ForEach-Object { throw "Duplicate object $($_.Name)" } 
0

При импорте в массив каждый объект уникален. В этом примере нецелесообразно оставлять объекты в массиве, так как нет возможности предсказуемо перебирать их, поскольку некоторые объекты могут содержать несколько ключей.

{ 
    "foo": 42 
} 

против

{ 
    "bar": 9000, 
    "buzz": 9000 
} 

Это вызовет боль в сердце при попытке перебрать все объекты.

Вместо этого я взял все элементы массива и объединил их в один объект powershell. Поскольку объекты powershell являются в основном хэшами, а хеши по дизайну должны иметь все ключи уникальные, powershell автоматически будет ошибочно, если перезаписать ключ.

function Load-Servers { 

    $allObjects = @(
     Get-ChildItem '.\servers' -Filter *.json -Recurse | Get-Content -Raw | ConvertFrom-Json 
    ) 
    $object = New-Object PSObject 
    Foreach ($o in $allObjects) { 
     $o.psobject.members | ? {$_.Membertype -eq "noteproperty" } | %{$object | add-member $_.Name $_.Value } 
    } 

    return $object 
} 
Смежные вопросы