C# .NETWebService反序列化为DateTime()的Java JSONObject

C# .NETWebService反序列化为DateTime()的Java JSONObject,c#,java,json,datetime,C#,Java,Json,Datetime,我有一个.NETWebService,它应该通过json与Java应用程序通信 现在,我在服务器端有一个如下所示的方法: [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public DateTime GetDate(DateTime input) { return input; } {"input":"\/Date(1279176056000)\/"}

我有一个.NETWebService,它应该通过json与Java应用程序通信

现在,我在服务器端有一个如下所示的方法:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public DateTime GetDate(DateTime input)
    {
        return input;
    }
{"input":"\/Date(1279176056000)\/"}
我可以通过C#应用程序发送接收日期时间值。按照惯例,日期值序列化为:

\/Date(1279176056000)\/
其中,数字定义为自历元起的秒数。 因此,如果我想调用该服务,我的json请求字符串必须如下所示:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public DateTime GetDate(DateTime input)
    {
        return input;
    }
{"input":"\/Date(1279176056000)\/"}
但是,我不知道如何通过Java端的json.org.*类实现这一点。
问题:如果我使用此代码:

JSONObject json = new JSONObject();
json.put("input", "\\/Date(1279176056000)\\/");
JSONObject足够聪明,可以在通过导线发送字符串之前转义字符串本身,因此我得到:

{"input":"\\/Date(1279176056000)\\/"}
这将导致服务器端反序列化期间出现异常:

System.FormatException: \/Date(1279183256000)\/ is not a valid value for DateTime
bei System.ComponentModel.DateTimeConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
bei System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
bei System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object& convertedObject)
bei System.Web.Script.Serialization.ObjectConverter.ConvertObjectToType(Object o, Type type, JavaScriptSerializer serializer)
bei System.Web.Script.Services.WebServiceMethodData.StrongTypeParameters(IDictionary`2 rawParams)
bei System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary`2 parameters)
bei System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context, WebServiceMethodData methodData, IDictionary`2 rawParams)
bei System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)
长话短说:如何将反斜杠作为参数传递给JSONObject而不进行转义?


你可能会认为我只是自己构建JSON字符串,但我真的很想发送和接收包含日期属性的更复杂的对象/数组,我不想自己处理整个JSON生成过程。

我也有同样的问题。在提交值之前,我会进行一次replaceAll。对于Java和RegEx,有很多斜杠需要正确转义

JSONObject json = new JSONObject();
json.put("input", "\\/Date(1279176056000)\\/");

String stringToSubmit = json.toString().replaceAll("\\\\\\\\", "\\\\");

以下是我自己的解决方案:

import java.util.Date;

public class DateConverter {

    private static long TicksToMillisOffset = 621355968000000000L;
    private static long TicksPerMillisecond = 10000L;

    public static Long toTicks(Date date)
    {
        if (date == null) return null;

        int offset = date.getTimezoneOffset() * 60;
        long ms = date.getTime();

        return (ms + offset) * TicksPerMillisecond + TicksToMillisOffset;   
    }

    public static Date fromTicks(Long ticks)
    {
        return ticks == null 
            ? null
            : new Date((ticks - TicksToMillisOffset) / TicksPerMillisecond);
    }

    public static String toJSONString(Date date) {
        return date != null ? date.toGMTString() : null;
    }

    public static Date fromJSONString(String string) {

        // expected: "/Date(secondssinceepoch)/"
        if (string.matches("^/Date\\(\\d+\\)/$")) {
            String value = string.replaceAll("^/Date\\((\\d+)\\)/$", "$1");
            return new Date(Long.valueOf(value));
        }
        else {
            return new Date(Date.parse(string));
        }

    }

}
用法:

// deserialisation:
JSONObject json = GetJSONObjectFromNetWebService();

Poco item = new Poco();
item.id = json.getInt("Id");
item.name = json.GetString("Name");
item.dateValue = DateConverter.fromJSONString(json.getString("DateValue"));

// serialisation
JSONObject json = new JSONObject();

Poco item = GetPocoFromSomeWhereElse();
json.put("Id", item.id);
json.put("Name", item.name);
json.put("DateValue", DateConverter.toJSONString(item.dateValue));

你不想从json datetime对象中创建一个常规的datetime对象,然后发送它吗?我希望能够使用json和c#的SOAP在我的Web服务中的方法,并且我希望具有类型安全性,因此我的参数必须是datetime。好的,在你的评论之后,我考虑过了。我是如此专注于以预期的格式发送日期,以至于我没有想到以不同的方式格式化日期(date.toString()首先产生了一个formatexception,这就是为什么我想到模拟网络格式)。但它很简单:date.togmString()成功了。您可能想删除C#标记,因为据我所知,答案都是特定于Java的。我已经忘记了这个问题。几十年前我自己解决了这个问题,并添加了一个很好的解决方案。谢谢你的更新。