Repository navigation
ConvertFrom-Json silently throws away duplicated keys with identical casing #5199
Description
Activity
- changed the title
[-]ConvertFrom-Json silently throws away duplicated keys[/-][+]ConvertFrom-Json silently throws away duplicated keys with identical casing[/+]on Oct 22, 2017 - addedBreaking-Changebreaking change that may affect usersbreaking change that may affect users
on Oct 23, 2017 It is really bug - Json don't allow duplicate keys with the same case.
As best as I can tell JSON doesn't require member names to be unique, only recommended.
:-) I believe implementations "MUST" follow "SHOULD recommendations".
In any case I think
JsonConvert.DeserializeObjectworks incorrectly.bergmeister commented
on Oct 25, 2017 ContributorAuthorMore actionsI found the first 2 answers here interesting and their statement is basically that although it is valid JSON from a puristic point of view, JSON parsing libraries have and can choose different behaviours without conflicting with the standard. Normally one should trust the foundation, which is
Newtonsoft.Json, but I am with Ilya (@iSazonov) that it's behaviour is sub-optimal. If there is a way of at least detecting the duplicates then at least a warning would be nice. A detection should be possible using a custom converter type when callingJsonConvert.DeserializeObjectbut it might result in a higher computational cost.If the standard say "SHOULD" it allows for a reasonable deviation from the standard. This means that the API must have the option to turn on or off duplicate keys.
bergmeister commented
on Oct 25, 2017 ContributorAuthorMore actionsAccording to the author of
Newtonsoft.Jsonin his comment here it does not seem to be possible, therefore a different library might need to be used unfortunately.Is there a known use case that depends on duplicate keys? Otherwise, based on the standard's recommendation, I don't think we must support it and warning the user is sufficient.
Neton.Json is very popular library - if they don't fix (won't fix) we can ignore this in code and only add notes in docs.
microsoft-github-policy-service commented
on Nov 16, 2023 ContributorMore actionsThis issue has not had any activity in 6 months, if this is a bug please try to reproduce on the latest version of PowerShell and reopen a new issue and reference this issue if this is still a blocker for you.
microsoft-github-policy-service commented
on Nov 16, 2023 ContributorMore actionsThis issue has not had any activity in 6 months, if this is a bug please try to reproduce on the latest version of PowerShell and reopen a new issue and reference this issue if this is still a blocker for you.
- addedResolution-No ActivityIssue has had no activity for 6 months or moreIssue has had no activity for 6 months or more
on Nov 16, 2023 microsoft-github-policy-service commented
on Nov 16, 2023 ContributorMore actionsThis issue has not had any activity in 6 months, if this is a bug please try to reproduce on the latest version of PowerShell and reopen a new issue and reference this issue if this is still a blocker for you.
microsoft-github-policy-service commented
on Nov 23, 2023 ContributorMore actionsThis issue has been marked as "No Activity" as there has been no activity for 6 months. It has been closed for housekeeping purposes.
- addedWG-Cmdletsgeneral cmdlet issuesgeneral cmdlet issuesand removed
on Jul 17, 2026
If the JSON contains duplicate keys with the same casing, then only the last key is used and the others are silently thrown away. The code in
JsonObject.cshere actually caters for this case and would throw an error but it never gets to that stage becauseJsonConvert.DeserializeObjecthere does not throw when there are duplicate keys and simply decides to take the last one.Steps to reproduce
Expected behavior
Either a warning that duplicated keys were disregarded or an error stating that duplicate keys are not allowed unless e.g something like. a
-Forceswitch is used. Given that this would be a breaking change, it will probably have to be a warning.Actual behavior
Only the last key is used when there are duplicate keys
key --- value2Environment data