加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:17:16 所属栏目:asp.Net 来源:网络整理
导读:我使用Jackson JSON库在我的 Android应用程序中解析服务器中的JSON.但是,每当我收到DateTime时,解析请求都会失败,因为它采用以下格式: "/Date(1277931782420)/" 我知道我应该这样做: ObjectMapper om = new ObjectMapper();om.setDateFormat(new TicksSinc
我使用Jackson JSON库在我的 Android应用程序中解析服务器中的JSON.但是,每当我收到DateTime时,解析请求都会失败,因为它采用以下格式:

"/Date(1277931782420)/"

我知道我应该这样做:

ObjectMapper om = new ObjectMapper();
om.setDateFormat(new TicksSinceFormat());

但是我根本不知道我是否可以使用SimpleDateFormat(我会使用什么格式的字符串?)或者我需要编写自己的DateFormat解析器.所以,如果有人可以帮助代码示例,我会非常感激.

编辑:
好的,请参阅我的答案以获取完整代码.

解决方法

事实证明这比我预期的要困难:

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 Ticks VS Java ticks的差异 – 但是现在这样做了.如果某人有更好的解决方案或更深入地了解我将在稍后处理的问题 – 请随时发布,如果情况好转,我会将您的答案标记为正确.

编辑:正如我在question & answer中解释的那样,我已经切换到服务器上的ServiceStack.Text库,它返回不同的ISO8601格式.对于那种格式,我使用稍微不同的解析(因为Jackson在解析包含毫秒的ISO8601时遇到问题).当然,和我发布的其他代码一样 – 请告诉我你是否有更好的版本(请发布代码/编辑这篇文章,而不是诉诸于如何做的哲学修辞):

@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,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();
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读