Ho riscontrato un problema durante l'utilizzo di PowerShell v3 durante la conversione di stringhe JSON di dimensioni superiori a 2 MB. Il limite predefinito nel serializzatore JSON utilizzato da PowerShell è impostato su 2 MB che spiega l'errore.Lunghezza massima ConvertFrom-Json
Tuttavia, quando deserializzo l'oggetto utilizzando ConvertFrom-Json su un set più piccolo (ho vari oggetti dati con raccolte interne più piccole e più grandi ma sono gli stessi oggetti) restituisce oggetti molto belli con tutte le proprietà a cui posso accedere facilmente.
Per superare i limiti del serializzatore ho cercato di deserializzare dati manualmente:
$jsser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$jsser.MaxJsonLength = $jsser.MaxJsonLength * 10
$jsser.RecursionLimit = 99
$outObject = $jsser.DeserializeObject($json)
L'oggetto appare diverso sembra che collezioni interne non erano deserializzate e quando provo ad eseguire proprietà ritornano risultati vuoti.
Le mie domande:
presupposto è
ConvertFrom-Json
fa qualche magia supplementare o in qualche modo crea un modello per l'oggetto prima di serializzazione. Qualche idea su come replicarlo?L'oggetto che ottengo è sempre un
PSCustomObject
; se ottengo l'oggetto che voglio impostare daConvertFrom-Json
c'è comunque da usare come tipo di oggetto in JsonSerializer?
Sì, ma in PowerShell sto cercando di evitare l'importazione.Net dll PowerShell ha i propri oggetti dinamici che sono popolati con proprietà al volo e funzionava alla grande con file sotto 2MB. Voglio solo forzarlo a funzionare allo stesso modo con file superiori a 2 MB. – Jammes
Per essere completamente PowerShell è possibile utilizzare XML. Lo uso nei miei script PowerShell V2.0. Supporta grandi jsons, ma è un po 'prolisso da usare. – JPBlanc
Se osservi la mia domanda iniziale, ho già trovato un modo per deserializzare JSON di grandi dimensioni. Quando si crea un'istanza del serializzatore, è possibile modificare la proprietà MaxJsonLength. Dovrai utilizzare Invoke-WebRequest piuttosto che Invoke-RestRequest e poi seguire RawContent e cercare il primo '{' e rimuovere tutto da infront e hai un json pulito. Su oggetti di grandi dimensioni questa serializzazione Xml potrebbe richiedere il suo pedaggio. – Jammes