我在使用 WCF REST 服务时遇到问题。我尝试返回的线对象具有未设置的某些属性,导致 DateTime 类型的属性的 DateTime.MinValue。该服务返回一个空文档(HTTP 状态为 200 ???)。当我尝试自己调用 JSON 序列化时,抛出的异常是:
SerializationException: DateTime values that are greater than DateTime.MaxValue or smaller than DateTime.MinValue when converted to UTC cannot be serialized to JSON.
这可以通过在控制台应用程序中运行以下代码来重现:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(DateTime));
MemoryStream m = new MemoryStream();
DateTime dt = DateTime.MinValue;
// throws SerializationException in my timezone
ser.WriteObject(m, dt);
string json = Encoding.ASCII.GetString(m.GetBuffer());
Console.WriteLine(json);
为什么会出现这种行为?我认为这与我的时区(GMT+1)有关。由于 DateTime.MinValue 是默认值(DateTime),我希望这可以毫无问题地序列化。
关于如何使我的 REST 服务正常运行的任何提示?我不想更改我的 DataContract。
最佳答案
主要问题是 DateTime.MinValue
有 DateTimeKind.Unspecified
种类。定义为:
MinValue = new DateTime(0L, DateTimeKind.Unspecified);
但这不是一个真正的问题,这个定义导致序列化过程中出现问题。 JSON DateTime 序列化通过:
System.Runtime.Serialization.Json.JsonWriterDelegator.WriteDateTime(DateTime value)
不幸的是它被定义为:
...
if (value.Kind != DateTimeKind.Utc)
{
long num = value.Ticks - TimeZone.CurrentTimeZone.GetUtcOffset(value).Ticks;
if ((num > DateTime.MaxValue.Ticks) || (num < DateTime.MinValue.Ticks))
{
throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(XmlObjectSerializer.CreateSerializationException(SR.GetString("JsonDateTimeOutOfRange"), new ArgumentOutOfRangeException("value")));
}
}
...
所以它不考虑Unspecified
,将其视为Local
。为避免这种情况,您可以定义自己的常量:
MinValueUtc = new DateTime(0L, DateTimeKind.Utc);
或
MinValueUtc = DateTime.MinValue.ToUniversalTime();
这当然看起来很奇怪,但它有帮助。
https://stackoverflow.com/questions/4025851/
相关文章:
json - 将 JSON 序列化为查询字符串的标准化方法?
c# - asp.net asmx Web 服务返回 xml 而不是 json
database - Fabric.js - 如何使用自定义属性在服务器上保存 Canvas
javascript - 'JSON' 是 Internet Explorer 中 JavaScri
c# - 复杂类型在 ApiController 参数中为空
java - 在不知道 JSON 格式的情况下用 Java 解析 JSON
json - 从 HttpServletRequest 检索 JSON 对象文字