Menggunakan Powershell Saya membaca dokumen json sewenang-wenang untuk disimpan di dalam MongoDB. Ini berjalan dengan baik sampai saya menemukan dokumen json yang memiliki URL untuk nama elemen. URL berisi titik "." yang tidak diizinkan MongoDB sebagai bagian dari nama elemen.

Elemen json yang bermasalah dapat terjadi di beberapa level dalam dokumen JSON

{
    "ENCODER":  "Lavf58.42.100",
    "HTTP://YOUTUBE.COM/STREAMING/OTF/DURATIONS/112015":  "Segment-Count: 9\r\nSegment-Durations-Ms: 5339(r=7),2970,\r\n\r\n"
}

Error yang dilontarkan adalah: Nama elemen 'HTTP://YOUTUBE.COM/STREAMING/OTF/DURATIONS/112015' is not valid'

Jika saya secara manual menghapus periode impor data tanpa masalah.

Jadi, bagaimana cara memindai setiap nama properti PSObject dan mengganti karakter terlepas dari kedalamannya?

1
jfroebe 3 Juli 2020, 00:09

1 menjawab

Jawaban Terbaik

Inilah cara Anda melakukannya untuk satu PSObject:

# build the test data
$json = "{'aaa':'bbb', 'c.c':'ddd'}"
$data = $json | ConvertFrom-Json
$data

# aaa c.c
# --- ---
# bbb ddd

# rename properties with a "." in their name
foreach( $property in $data.psobject.Properties )
{
    if( $property.Name.IndexOf(".") -ge 0 )
    {
        $data.psobject.Properties.Remove($property.Name)
        $data | Add-Member -NotePropertyName $property.Name.Replace(".", "_") -NotePropertyValue $property.Value
    }
}
$data

# aaa c_c
# --- ---
# bbb ddd

Catatan, menghapus dan menambahkan properti dapat mengubah urutan 'alami' properti, yang dapat merusak kode yang bergantung padanya. Sebagai contoh:

aaa c.c eee
--- --- ---
bbb ddd fff

Menjadi

aaa eee c_c
--- --- ---
bbb fff ddd

Dengan mengingat hal itu, sekarang yang perlu Anda lakukan adalah melintasi semua properti bersarang yang juga merupakan objek PSO dan menerapkannya secara rekursif :-).

1
mclayton 2 Juli 2020, 21:37