{"record":{"id":"dd6762d7c3061185","repo":"JamesNK/Newtonsoft.Json","slug":"unexpected-merge-array-handling-when-merging-json","errorCode":null,"errorMessage":"Unexpected merge array handling when merging JSON.","messagePattern":"Unexpected merge array handling when merging JSON\\.","errorType":"exception","errorClass":"ArgumentOutOfRangeException","httpStatus":null,"severity":"error","filePath":"Src/Newtonsoft.Json/Linq/JContainer.cs","lineNumber":1270,"sourceCode":"                                {\n                                    JToken contentValue = CreateFromContent(targetItem);\n                                    if (contentValue.Type != JTokenType.Null)\n                                    {\n                                        target[i] = contentValue;\n                                    }\n                                }\n                            }\n                        }\n                        else\n                        {\n                            target.Add(CreateFromContent(targetItem));\n                        }\n\n                        i++;\n                    }\n                    break;\n                default:\n                    throw new ArgumentOutOfRangeException(nameof(settings), \"Unexpected merge array handling when merging JSON.\");\n            }\n        }\n    }\n}","sourceCodeStart":1252,"sourceCodeEnd":1274,"githubUrl":"https://github.com/JamesNK/Newtonsoft.Json/blob/4f73e74372445108d2c1bda37b36e6f5e43402e0/Src/Newtonsoft.Json/Linq/JContainer.cs#L1252-L1274","documentation":"ArgumentOutOfRangeException thrown by JContainer.MergeEnumerableContent when the MergeArrayHandling value is not one of the defined enum members (Concat, Union, Replace, Merge). The switch over the enum falls through to default; this is only reachable when an undefined/corrupted enum value is supplied, since all four defined members are handled.","triggerScenarios":"Passing a JsonMergeSettings with MergeArrayHandling set to an undefined enum value, e.g. (MergeArrayHandling)999, to JContainer.Merge when merging arrays. Reachable via reflection, unsafe enum casts, or a corrupted/instantiated-with-invalid-int enum.","commonSituations":"Casting an arbitrary integer to MergeArrayHandling; deserializing a MergeArrayHandling from untrusted/loosely-typed config without validation; reflection-driven code that sets the property via a boxed enum.","solutions":["Validate the enum before merging: Enum.IsDefined(typeof(MergeArrayHandling), value) and reject/fallback if false.","Use only named MergeArrayHandling members (Concat/Union/Replace/Merge) from strongly-typed config.","If accepting user-supplied values, parse with Enum.Parse (case-sensitive) or map known strings explicitly."],"exampleFix":"// before\nvar settings = new JsonMergeSettings { MergeArrayHandling = (MergeArrayHandling)42 };\ntargetArray.Merge(sourceArray, settings);\n\n// after\nMergeArrayHandling h;\nvar ok = Enum.TryParse<MergeArrayHandling>(userValue, true, out h) && Enum.IsDefined(typeof(MergeArrayHandling), h);\nvar settings = new JsonMergeSettings { MergeArrayHandling = ok ? h : MergeArrayHandling.Concat };","handlingStrategy":"validation","validationCode":"if (!Enum.IsDefined(typeof(MergeArrayHandling), settings.MergeArrayHandling))\n{\n    throw new ArgumentOutOfRangeException(nameof(settings), \"Invalid MergeArrayHandling.\");\n}","typeGuard":"static bool IsValid(MergeArrayHandling h) => Enum.IsDefined(typeof(MergeArrayHandling), h);","tryCatchPattern":"try { target.Merge(source, settings); }\ncatch (ArgumentOutOfRangeException ex) when (ex.Message.Contains(\"merge array handling\"))\n{\n    settings.MergeArrayHandling = MergeArrayHandling.Concat;\n    target.Merge(source, settings);\n}","preventionTips":["Always construct MergeArrayHandling from named enum members.","Validate user-supplied enum values with Enum.IsDefined before merging.","Avoid casting arbitrary integers to MergeArrayHandling."],"tags":["newtonsoft-json","linq-to-json","merge","enum","argument-validation"],"analyzedSha":"4f73e74372445108d2c1bda37b36e6f5e43402e0","analyzedAt":"2026-08-07T06:10:08.596Z","schemaVersion":2},"datasetVersion":"2026-08-07T07:17:06.508Z"}