Java JSONObject для десериализации веб-службы .net в DateTime () - PullRequest
2 голосов
/ 15 июля 2010

У меня есть .net Webservice, который должен взаимодействовать с приложением Java через json.

Теперь у меня есть метод на стороне сервера, который выглядит следующим образом:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public DateTime GetDate(DateTime input)
    {
        return input;
    }

изПриложение C # я могу отправить получить значение DateTime.Это соглашение, что значения Date сериализуются как:

\/Date(1279176056000)\/

, где число определяется в секундах с начала эпохи.Поэтому, если я хочу вызвать этот сервис, моя строка запроса json должна выглядеть следующим образом:

{"input":"\/Date(1279176056000)\/"}

Как бы то ни было, я не знаю, как этого добиться с помощью классов json.org. * На стороне Java.
Проблема: если я использую этот код:

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, но я действительно хочу отправлять и получать более сложные объекты / массивы, содержащие свойства Date, и я не хочу сам обрабатывать все поколение JSON.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

У меня была такая же проблема.Перед отправкой значений я делаю replaceAll.Для Java и для RegEx есть много косых черт, которые необходимо экранировать.

0 голосов
/ 20 сентября 2011

Вот мое собственное решение:

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...