我把這個在我的代碼:
JavaScriptSerializer oSerializer = new JavaScriptSerializer();
oSerializer.MaxJsonLength *= 2;
ws_Out = (ClsWsOut)oSerializer.Deserialize(jsonOut, ws_Out.GetType());
凡ws_Out.GetType()是一個CLASSE我定義解析JSON。
public class ClsLogin_In :ClsWsIn
{
public string login { get; set; }
public string passwd { get; set; }
}
public class ClsLogin_Out : ClsWsOut
{
public int error { get; set; }
public string error_desc { get; set; }
public int key { get; set; }
}
編輯
在PowerShell中V3時,由Web服務返回的JSON是非常大的PowerShell的V3正在發送異常。 因此,我使用XML序列化,這裏是我的功能,它也使用外部程序集,但它們是基本程序集,XML有點冗長,但它有效。
Add-Type -AssemblyName System.ServiceModel.Web, System.Runtime.Serialization
$utf8 = [System.Text.Encoding]::UTF8
function Write-String
{
PARAM([Parameter()]$stream,
[Parameter(ValueFromPipeline=$true)]$string)
PROCESS
{
$bytes = $utf8.GetBytes($string)
$stream.Write($bytes, 0, $bytes.Length)
}
}
function Convert-JsonToXml
{
PARAM([Parameter(ValueFromPipeline=$true)][string[]]$json)
BEGIN
{
$mStream = New-Object System.IO.MemoryStream
}
PROCESS
{
$json | Write-String -stream $mStream
}
END
{
$mStream.Position = 0
try
{
$jsonReader = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonReader($mStream,[System.Xml.XmlDictionaryReaderQuotas]::Max)
$xml = New-Object Xml.XmlDocument
$xml.Load($jsonReader)
$xml
}
finally
{
$jsonReader.Close()
$mStream.Dispose()
}
}
}
function Convert-XmlToJson
{
PARAM([Parameter(ValueFromPipeline=$true)][Xml]$xml)
PROCESS
{
$mStream = New-Object System.IO.MemoryStream
$jsonWriter = [System.Runtime.Serialization.Json.JsonReaderWriterFactory]::CreateJsonWriter($mStream)
try
{
$xml.Save($jsonWriter)
$bytes = $mStream.ToArray()
[System.Text.Encoding]::UTF8.GetString($bytes,0,$bytes.Length)
}
finally
{
$jsonWriter.Close()
$mStream.Dispose()
}
}
}
這裏是一個例子。
$json = @'
{
"data": {
"langid": 7,
"results": [{
"first_aired": "2010-11-15",
"name": "Accused",
"tvdbid": 72663
},
{
"first_aired": "2010-01-17",
"name": "Enzai: Falsely Accused",
"tvdbid": 135881
}]
},
"message": "",
"result": "success"
}
'@
$xmlOut = Convert-JsonToXml -json $json
($xmlOut.root.data.results).ChildNodes[0].tvdbid.InnerText
($xmlOut.root.data.results).ChildNodes[1].tvdbid.InnerText
是的但在PowerShell中我試圖避免導入。Net dlls Powershell擁有自己的動態對象,這些動態對象在運行時會與屬性一起填充,並且在2MB以下的文件下工作良好。我只是想強制它以2MB以上的文件以相同的方式工作。 – Jammes
要成爲完整的PowerShell,您可以使用XML。我在PowerShell V2.0腳本中使用它。它支持大的jsons,但使用起來有點冗長。 – JPBlanc
如果你看看我的原始問題,我已經找到了反序列化大型JSON的方法。當你自己實例化序列化程序時,你可以改變MaxJsonLength屬性。您必須使用Invoke-WebRequest而不是Invoke-RestRequest,而不是跟隨RawContent並查找第一個「{」並從infront中刪除所有內容,並且您有一個乾淨的json。在大對象上,這個Xml序列化可能會帶來收益。 – Jammes