Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java中的Jackson JSON库解析ASP.NET MVC返回的日期_Java_Android_Asp.net Mvc_Jackson - Fatal编程技术网

使用Java中的Jackson JSON库解析ASP.NET MVC返回的日期

使用Java中的Jackson JSON库解析ASP.NET MVC返回的日期,java,android,asp.net-mvc,jackson,Java,Android,Asp.net Mvc,Jackson,我正在使用Jackson JSON库解析Android应用程序中服务器上的JSON。但是,每当我收到DateTime时,解析请求都会失败,因为它采用以下格式: "/Date(1277931782420)/" 我知道我应该这样做: ObjectMapper om = new ObjectMapper(); om.setDateFormat(new TicksSinceFormat()); 但我不知道我是否可以使用SimpleDataFormat(我会使用什么格式的字符串?),或者我需要编写自己

我正在使用Jackson JSON库解析Android应用程序中服务器上的JSON。但是,每当我收到DateTime时,解析请求都会失败,因为它采用以下格式:

"/Date(1277931782420)/"
我知道我应该这样做:

ObjectMapper om = new ObjectMapper();
om.setDateFormat(new TicksSinceFormat());
但我不知道我是否可以使用SimpleDataFormat(我会使用什么格式的字符串?),或者我需要编写自己的DateFormat解析器。所以,如果有人能帮我编写代码示例,我将不胜感激

编辑:
好的,完整的代码见我的答案。

我可能在这方面错了,因为我还没有深入到Android开发中,但是您介绍的格式:

"/Date(1277931782420)/"
似乎是Unix时代

如果是这种情况,则不希望/不需要使用
SimpleDateFormat
。相反,尝试从它创建一个
Long
,并传递给
Date
构造函数,说明它是基于秒还是基于毫秒的历元值


下面是一个StackOverflow帖子,它提供了执行此操作的代码:

事实证明,这比我预期的更难:

public class TicksSinceFormat extends DateFormat {
    @Override
    public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) {
        long millis = date.getTime();

        return new StringBuffer("/Date(" + millis + ")/");
    }

    @Override
    public Date parse(String string, ParsePosition position) {
        int start = string.indexOf("(") + 1;
        int end = string.indexOf(")");

        String ms = string.substring(start, end);
        Date date = new Date(Long.parseLong(ms));

        position.setIndex(string.length() - 1); // MUST SET THIS
        return date;
    }

    @Override
    public Object clone() {
        return new TicksSinceFormat(); // MUST SET THIS
    }
}
使用类非常简单,只需执行以下操作:

ObjectMapper om = new ObjectMapper();
om.setDateFormat(new TicksSinceFormat())
我认为这可以被更好地编码,+当涉及到.NET滴答声和Java滴答声时,我需要处理它们之间的差异-但现在这样就可以了。如果有人对上述问题有更好的解决方案或更深入的见解,我将在稍后处理-请随意发布,如果更好,我会将您的答案标记为正确答案

编辑:正如我在本文中所解释的,我已经切换到服务器上的ServiceStack.Text library,它返回不同的ISO8601格式。对于这种格式,我使用稍微不同的解析(因为Jackson解析包含毫秒的ISO8601时遇到问题)。当然,与我发布的其他代码一样,请告诉我您是否有更好的版本(请发布代码/编辑此文章,而不是诉诸哲学修辞来说明应该如何操作):


谢谢你的链接-我正在处理这个问题,但是有一些意想不到的问题(请参阅编辑),看起来你的代码应该可以正常工作。。。我要做的唯一更改是在
parse
方法中使用正则表达式捕获组,而不是string.indexOf/string.substring。这只是一个时尚的东西。。。我总是发现string.indexOf/substring在索引/长度方面有些脆弱和棘手。这只是我的拙见。@PhilipTenn愿意为我提供一个可靠的正则表达式和代码吗?
@SuppressLint("SimpleDateFormat")
public class JacksonSimpleDateFormat extends SimpleDateFormat {
    public JacksonSimpleDateFormat() {
        if (mParser == null) {
            mParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
            mParser.setTimeZone(TimeZone.getTimeZone("UTC"));
        }
    }

    @Override
    public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) {
        return mParser.format(date, buffer, field);
    }

    private static SimpleDateFormat mParser;
    @Override
    public Date parse(String string, ParsePosition position) {
        String str = string.split("\\.")[0];

        Date date = null;
        try {
            date = mParser.parse(str);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        position.setIndex(string.length() - 1);
        return date;
    }

    @Override
    public Object clone() {
        return new JacksonSimpleDateFormat();
    }
}