{"record":{"id":"243c2799de75ee6f","repo":"OrchardCMS/OrchardCore","slug":"cannot-convert-value-to-char","errorCode":null,"errorMessage":"Cannot convert {value} to Char","messagePattern":"Cannot convert (.+?) to Char","errorType":"exception","errorClass":"InvalidCastException","httpStatus":null,"severity":"error","filePath":"src/OrchardCore/OrchardCore.Abstractions/Json/Dynamic/JsonDynamicValue.cs","lineNumber":296,"sourceCode":"    {\n        return value?._jsonValue?.GetValue<bool?>();\n    }\n\n    public static explicit operator byte(JsonDynamicValue value)\n    {\n        return value?._jsonValue?.GetValue<byte>()\n            ?? throw new InvalidCastException($\"Cannot convert {value} to Byte\");\n    }\n\n    public static explicit operator byte?(JsonDynamicValue value)\n    {\n        return value?._jsonValue?.GetValue<byte?>();\n    }\n\n    public static explicit operator char(JsonDynamicValue value)\n    {\n        return value?._jsonValue?.GetValue<char>()\n            ?? throw new InvalidCastException($\"Cannot convert {value} to Char\");\n    }\n\n    public static explicit operator char?(JsonDynamicValue value)\n    {\n        return value?._jsonValue?.GetValue<char?>();\n    }\n\n    public static explicit operator DateTime(JsonDynamicValue value)\n    {\n        return value?._jsonValue?.GetValue<DateTime>()\n            ?? throw new InvalidCastException($\"Cannot convert {value} to DateTime\");\n    }\n\n    public static explicit operator DateTime?(JsonDynamicValue value)\n    {\n        return value?._jsonValue?.GetValue<DateTime?>();\n    }\n","sourceCodeStart":278,"sourceCodeEnd":314,"githubUrl":"https://github.com/OrchardCMS/OrchardCore/blob/4306c0717fe573f6fca1b4955909ddab6a192807/src/OrchardCore/OrchardCore.Abstractions/Json/Dynamic/JsonDynamicValue.cs#L278-L314","documentation":"The explicit (char) cast operator on JsonDynamicValue calls GetValue<char>() and throws InvalidCastException when the value is null or not a single-character JSON value. JSON has no char token, so only strings/numbers that Newtonsoft can narrow to char succeed.","triggerScenarios":"Casting (char)someJsonDynamicValue where the token is an empty string, a multi-character string like \"ab\", a non-numeric value, or null.","commonSituations":"Single-letter codes stored as JSON strings that occasionally arrive empty or longer; deserialized data where a char field was serialized as string and later widened.","solutions":["Use the explicit char? cast or GetValue<char?>() and treat null explicitly.","Convert via string: var s = value?.ToString(); if (s?.Length == 1) ch = s[0];","Validate the token is a length-1 string before casting.","Catch InvalidCastException when the shape of dynamic data is uncertain."],"exampleFix":"// before\nchar code = (char)field.Value; // throws for \"AB\"\n// after\nvar s = field.Value?.ToString();\nchar code = s?.Length == 1 ? s[0] : '\\0';","handlingStrategy":"type-guard","validationCode":"bool IsSingleChar(JsonDynamicValue v) => v?.ToString() is { Length: 1 };","typeGuard":"static bool TryGetChar(JsonDynamicValue v, out char value)\n{\n    var s = v?.ToString();\n    if (s?.Length == 1) { value = s[0]; return true; }\n    value = default; return false;\n}","tryCatchPattern":"char code;\ntry { code = (char)field.Value; }\ncatch (InvalidCastException) { var s = field.Value?.ToString(); code = s?.Length == 1 ? s[0] : '\\0'; }","preventionTips":["Validate the string form has exactly one character before casting.","Prefer char? cast or ToString-based extraction for dynamic JSON.","Remember JSON has no char token — expect string or number sources."],"tags":["json","dynamic","cast"],"backgroundTag":"type-mismatch","analyzedSha":"4306c0717fe573f6fca1b4955909ddab6a192807","analyzedAt":"2026-09-13T17:41:05.024Z","contentChangedAt":"2026-09-13T17:41:05.024Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}