Mam problem z używaniem PowerShell v3 podczas konwertowania łańcuchów JSON o rozmiarze większym niż 2 MB. Domyślne ograniczenie w serializatorze JSON używanym przez PowerShell jest ustawione na 2MB, co wyjaśnia błąd.ConvertFrom-Json maksymalna długość
Jednak, gdy deserializuję obiekt przy użyciu ConvertFrom-Json na mniejszym zestawie (mam różne obiekty danych z mniejszymi i większymi kolekcjami wewnętrznymi, ale są to te same obiekty), zwraca bardzo ładny obiekt ze wszystkimi właściwościami, do których mogę łatwo uzyskać dostęp.
Aby przezwyciężyć ograniczenia w serializatora próbowałem deserializowania dane ręcznie:
$jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$jsser.MaxJsonLength = $jsser.MaxJsonLength * 10
$jsser.RecursionLimit = 99
$outObject = $jsser.DeserializeObject($json)
Obiekt wygląda inaczej wydaje się, że zbiory wewnętrzne nie zostały rozszeregować i gdy próbuję wykonać właściwości wrócą pustych wyników.
Moje pytania:
założenie jest
ConvertFrom-Json
robi pewne dodatkowe magii lub w jakiś sposób tworzy szablon dla obiektu przed serializacji. Masz pomysł, jak to skopiować?Obiekt, który otrzymuję, to zawsze
PSCustomObject
; jeśli otrzymam obiekt, który chcę skonfigurować przezConvertFrom-Json
, czy mimo to jest on używany jako typ obiektu w JsonSerializer?
Tak, ale w programie Power Shell próbuję uniknąć importowania.Biblioteki sieciowe Powershell ma swoje własne obiekty dynamiczne, które są zapełniane właściwościami w locie i działało doskonale z plikami poniżej 2 MB. Po prostu chcę zmusić go do pracy w ten sam sposób z plikami powyżej 2 MB. – Jammes
Aby być pełnym PowerShell można użyć XML. Używam go w skryptach PowerShell V2.0. Obsługuje duże jsony, ale jest nieco gadatliwy w użyciu. – JPBlanc
Jeśli spojrzysz na moje oryginalne pytanie, znalazłem już sposób na deserializację dużego JSON. Podczas samodzielnego tworzenia serializera możesz zmienić właściwość MaxJsonLength. Będziesz musiał użyć Invoke-WebRequest zamiast Invoke-RestRequest, a następnie przestrzegać RawContent i szukać pierwszego "{" i usunąć wszystko z infront i masz czysty json. Na dużych obiektach ta serializacja Xml może zabrać swoje żniwo. – Jammes