提问者:小点点

RestSharp到WCF作为JSON日期格式化/序列化


我有一个WCF方法,它接受“时间戳”列表

public bool SyncTimestamps(IList<Timestamp> timestamps)

在我的一生中,我无法让客户机以它乐于使用RestSharp的格式向主机传递值。问题似乎与日期格式有关。

尝试%1

var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(timestamps);

输出1

"[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"2013-08-05T13:51:13.6201529Z\",\"TimestampActual\":\"2013-08-05T13:51:13.6201529Z\",\"Type\":1,\"Active\":false}]"

错误%1

DateTime content“2013-08-05T13:51:13.6201529Z”没有按照JSON的要求以“/date(”开头,以“)/”结尾。“

我读到这是RestSharp序列化程序的问题,所以我用json.net代替它,它产生一个稍微不同的日期字符串。

尝试2

var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(JsonConvert.SerializeObject(timestamps));    

产出2

{application/json="[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"2013-08-05T14:54:33.9261815+01:00\",\"TimestampActual\":\"2013-08-05T14:54:33.9251814+01:00\",\"Type\":1,\"Active\":false}]"}

错误2

The exception message is 'Expecting state 'Element'.. 
Encountered 'Text' with name '', namespace ''. '. See server logs for more details. 
The exception stack trace is: 

at ReadArrayOfTimestampFromJson(XmlReaderDelegator , XmlObjectSerializerReadContextComplexJson , XmlDictionaryString , XmlDictionaryString , CollectionDataContract ) 
at System.Runtime.Serialization.Json.JsonCollectionDataContract.ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) 
at System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) at 

有人可以建议一种方法来生成WCF服务将乐于接受并反序列化的dateformat吗?MSDN上的文档说明需要以下格式。

DateTime值以“/date(700000+0500)/”形式显示为JSON字符串,其中第一个数字(在提供的示例中为700000)是自1970年1月1日午夜以来GMT时区的常规(非夏令时)时间的毫秒数。

更新:

我在JSON.NET中找到了一个设置,它允许我将日期转换为WCF所要求的格式。

var settings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat };
JsonConvert.SerializeObject(obj, settings);

这似乎完成了创建序列化字符串的工作。

{application/json="[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"\\/Date(1375713542908+0100)\\/\",\"TimestampActual\":\"\\/Date(1375713542908+0100)\\/\",\"Type\":1,\"Active\":false}]"}

但是,我的服务仍然以“异常消息是'Expecting state'Element'..”来拒绝此操作。


共2个答案

匿名用户

除了JSON.NET之外,还有另一个JSON序列化库可以为您实现这一点:https://www.nuget.org/packages/servicestack.text/

var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;

var json = JsonSerializer.SerializeToString(timestamps);
request.AddParameter("application/json", json, ParameterType.RequestBody);

匿名用户

你就快到了。您只需将参数手动添加到请求中,而绕过有问题的RestSharp序列化程序。

var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
var settings = new JsonSerializerSettings() { DateFormatHandling=DateFormatHandling.MicrosoftDateFormat };
var json = JsonConvert.SerializeObject(timestamps,settings);

request.AddParameter("application/json",json,null,ParameterType.RequestBody);