Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <AsHashtable>' -TestCase $testCasesWithAndWithoutAsHashtableSwitch {
Param($AsHashtable)
{ ConvertFrom-Json '["1",' -AsHashtable:$AsHashtable } |
Should -Throw -ErrorId "System.ArgumentException,Microsoft.PowerShell.Commands.ConvertFromJsonCommand"
}
}