diff --git a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs index a5440ce29b7..b7c04b1e58b 100644 --- a/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs +++ b/src/Microsoft.PowerShell.Commands.Utility/commands/utility/WebCmdlet/JsonObject.cs @@ -59,6 +59,22 @@ public static object ConvertFromJson(string input, bool returnHashtable, out Err error = null; try { + // JsonConvert.DeserializeObject does not throw an exception when an invalid Json array is passed. + // This issue is being tracked by https://github.com/JamesNK/Newtonsoft.Json/issues/1321. + // To work around this, we need to identify when input is a Json array, and then try to parse it via JArray.Parse(). + + // If input starts with '[' (ignoring white spaces). + if (Regex.Match(input, @"^\s*\[").Success) + { + // JArray.Parse() will throw a JsonException if the array is invalid. + // This will be caught by the catch block below, and then throw an + // ArgumentException - this is done to have same behavior as the JavaScriptSerializer. + JArray.Parse(input); + + // Please note that if the Json array is valid, we don't do anything, + // we just continue the deserialization. + } + var obj = JsonConvert.DeserializeObject( input, new JsonSerializerSettings diff --git a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 index 39aa655b71e..e4a32a5ee88 100644 --- a/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 +++ b/test/powershell/Modules/Microsoft.PowerShell.Utility/ConvertFrom-Json.Tests.ps1 @@ -52,10 +52,4 @@ Describe 'ConvertFrom-Json' -tags "CI" { $json | Should -BeOfType Hashtable } } - - It 'Throws an ArgumentException with an incomplete array with AsHashtable switch set to ' -TestCase $testCasesWithAndWithoutAsHashtableSwitch { - Param($AsHashtable) - { ConvertFrom-Json '["1",' -AsHashtable:$AsHashtable } | - Should -Throw -ErrorId "System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand" - } }