Mel*_*Mel 16 c# wcf serialization datetime json
有没有改变WCF中DateTime的默认JSON序列化/反序列化?
目前,DateTime被序列化为/Date(1372252162657+0200)/
格式,应该没问题,但是当我的服务器不是UTC(我无法更改)时,我遇到了问题.
此服务正在处理的所有日期/时间数据均为UTC格式.当服务器使用UTC时,一切正常.但是,staging/prod环境设置为GMT + 1(Paris),并且序列化器假设日期/时间是GMT + 1,完全忽略该属性Kind
.因此,您希望调用DateTime.SetKind()
并将其设置为UTC将无法正常工作.实际上,序列化时间延迟了一个小时.
我可以进行双向日期对话(它在反序列化时也做出相同的假设,因此它的GMT + 1总是)对话的日期:UTC到/从服务器时间,但这是乏味的.所以我想也许我可以覆盖默认的序列化行为.
Mik*_*ill 21
只是为了扩展tdelepine的代码片段,这里是我使用过的代码:
在我的WCF JSON服务中,我有一个(可为空的)DateTime值,并希望我的服务以更易读的格式返回日期,因此我的iPhone应用程序将能够解释它.
应用一些更改后,这是我的JSON的样子:
请注意该UpdateDateOriginal
字段,它是WCF写入DateTimes的默认方式,以及UpdateDate
我使用下面的代码创建的友好字段.
我的原始行看起来像这样:
[DataMember]
public DateTime? UpdateDateOriginal { get; set; }
Run Code Online (Sandbox Code Playgroud)
...以下是创建新友好UpdateDate
JSON值的行.
[IgnoreDataMember]
public DateTime? UpdateDate { get; set; }
[DataMember(Name = "UpdateDate")]
private string UpdateDateString { get; set; }
[OnSerializing]
void OnSerializing(StreamingContext context)
{
if (this.UpdateDate == null)
this.UpdateDateString = "";
else
this.UpdateDateString = this.UpdateDate.Value.ToString("MMM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);
}
[OnDeserialized]
void OnDeserializing(StreamingContext context)
{
if (this.UpdateDateString == null)
this.UpdateDate = null;
else
this.UpdateDate = DateTime.ParseExact(this.UpdateDateString, "MMM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);
}
Run Code Online (Sandbox Code Playgroud)
实际上,您可能会发现DateTime
以ISO8601格式返回值更有用.例如:
UpdateTime: "2014-08-24T13:02:32",
Run Code Online (Sandbox Code Playgroud)
要做到这一点,只需使用我上面的代码,但是字符串更改"MMM/dd/yyyy HH:mm"
到"s"
这两个地方.
并且,如果您的DateTime值以UTC格式存储,但您希望WCF服务返回用户本地时区的值,则可以按照我的提示进行操作:
通过几个简单的例子,生活不容易!
tde*_*ine 12
您可以在json对象定义中使用此变通方法
[IgnoreDataMember]
public DateTime dateObject;
public string dateCustomSerialize
{
get {
//Custom get
}
set {
//Custom set
}
}
Run Code Online (Sandbox Code Playgroud)
在评估中放置您的自定义格式序列化
是的,这可以使用称为“消息格式化程序”的概念来完成
但是消息格式化程序在堆栈溢出方面很难解释,而且超出了解释范围。您可以参考WCF Extensibility : Message Formatters
如果你不想搞砸这个,那么可以使用 hack。
将每个方法的返回类型设置为Stream。
例如
public Stream GetStaticData()
{
var objTobeReturned = something;
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
return new MemoryStream(Encoding.UTF8.GetBytes(objTobeReturned.ToJson()));
}
Run Code Online (Sandbox Code Playgroud)
这里 ToJson() 是我自己的扩展方法,它使用 NewtonSoft 库将对象转换为 json 字符串。
WCF 将跳过序列化的流输出,并将其按原样传递给您的客户端。
我希望你能得到答案。