{"record":{"id":"b03903132257a853","repo":"JamesNK/Newtonsoft.Json","slug":"expected-date-object-value","errorCode":null,"errorMessage":"Expected date object value.","messagePattern":"Expected date object value\\.","errorType":"exception","errorClass":"JsonSerializationException","httpStatus":null,"severity":"error","filePath":"Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs","lineNumber":61,"sourceCode":"        public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)\n        {\n            long ticks;\n\n            if (value is DateTime dateTime)\n            {\n                DateTime utcDateTime = dateTime.ToUniversalTime();\n                ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTime);\n            }\n#if HAVE_DATE_TIME_OFFSET\n            else if (value is DateTimeOffset dateTimeOffset)\n            {\n                DateTimeOffset utcDateTimeOffset = dateTimeOffset.ToUniversalTime();\n                ticks = DateTimeUtils.ConvertDateTimeToJavaScriptTicks(utcDateTimeOffset.UtcDateTime);\n            }\n#endif\n            else\n            {\n                throw new JsonSerializationException(\"Expected date object value.\");\n            }\n\n            writer.WriteStartConstructor(\"Date\");\n            writer.WriteValue(ticks);\n            writer.WriteEndConstructor();\n        }\n\n        /// <summary>\n        /// Reads the JSON representation of the object.\n        /// </summary>\n        /// <param name=\"reader\">The <see cref=\"JsonReader\"/> to read from.</param>\n        /// <param name=\"objectType\">Type of the object.</param>\n        /// <param name=\"existingValue\">The existing property value of the JSON that is being converted.</param>\n        /// <param name=\"serializer\">The calling serializer.</param>\n        /// <returns>The object value.</returns>\n        public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)\n        {\n            if (reader.TokenType == JsonToken.Null)","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/JamesNK/Newtonsoft.Json/blob/4f73e74372445108d2c1bda37b36e6f5e43402e0/Src/Newtonsoft.Json/Converters/JavaScriptDateTimeConverter.cs#L43-L79","documentation":"Thrown by JavaScriptDateTimeConverter.WriteJson when the value is not a DateTime or DateTimeOffset. This converter serializes dates as a JavaScript Date constructor call (new Date(ticks)); only DateTime and DateTimeOffset are accepted, so any other type hits the else branch.","triggerScenarios":"Applying JavaScriptDateTimeConverter to a property whose runtime value is not DateTime/DateTimeOffset. On builds without DateTimeOffset support, passing a DateTimeOffset also fails. Passing a nullable DateTime whose Value was boxed as something else.","commonSituations":"Switching a property type from DateTime to string/int but keeping the JavaScriptDateTimeConverter attribute. Serializing DateOnly/TimeOnly with this converter. Polymorphic values whose runtime type differs from the declared type.","solutions":["Ensure only DateTime or DateTimeOffset values reach JavaScriptDateTimeConverter.","Remove or replace the converter on properties whose type changed.","For non-DateTime types, write a custom converter that converts to DateTime first."],"exampleFix":"// before: property changed type, converter left in place\n[JsonConverter(typeof(JavaScriptDateTimeConverter))]\npublic long TimestampMs { get; set; }\n\n// after: remove converter from non-date type\n[JsonProperty(\"timestampMs\")]\npublic long TimestampMs { get; set; }","handlingStrategy":"type-guard","validationCode":"object value = GetValue();\nif (value != null && !(value is DateTime) && !(value is DateTimeOffset))\n    throw new InvalidOperationException($\"JavaScriptDateTimeConverter cannot serialize {value.GetType()}\");","typeGuard":"static bool IsDateType(object v) =>\n    v is DateTime || v is DateTimeOffset;","tryCatchPattern":"try { conv.WriteJson(writer, value, serializer); }\ncatch (JsonSerializationException ex) when (ex.Message.Contains(\"Expected date object value\"))\n{\n    throw new InvalidOperationException($\"JavaScriptDateTimeConverter got {value?.GetType()}\", ex);\n}","preventionTips":["Only use JavaScriptDateTimeConverter for DateTime/DateTimeOffset values.","Remove the converter from properties whose type changed.","Prefer IsoDateTimeConverter unless the JS Date() format is explicitly required."],"tags":["serialization","converter","datetime","type-mismatch","javascript"],"analyzedSha":"4f73e74372445108d2c1bda37b36e6f5e43402e0","analyzedAt":"2026-08-07T06:10:08.596Z","schemaVersion":2},"datasetVersion":"2026-08-07T07:17:06.508Z"}