今天在Android的Json反序列化过程中,Date类型无法转化成自己想要的格式,鉴于之前在C#的反序列话中也遇到过这个问题,解决的同时,顺手做个总结,供自己及需要的人日后查阅。

      将Datetime对象序列化成Json对象是常有的事情,微软的序列化方法会将Datetime对象序列化成一个字符串:"\/Date(1234656000000)\/",看了就觉得恶心,不知道大微软咋想的,可能我能想到我就能进入微软,升职,加薪,迎娶白富美,从此走向事业的巅峰,想想还有点小激动呢,哈哈哈····废话少说,上干货。
Json串:

[{UserName:"姚玉星",NickName:"Mensar",Sex:"男",Hobby:"女",Birthday:"/Date(1298605481453+0800)/"}]
 
 
调用场景一(此处没有反序列化的操作,但同样要操作Birthday数据):
  作为前端页面Ajax调用的返回值,此时只需要一个函数,将字符串转换成JavaScript的Date类型。

var formatTime=function(value){
var d= eval('new'+(value.replace(/\//g,'')));
return d;
}
 
 
 
 
调用场景二:
   C#后台调用,反序列化Json,添加Newtonsoft.Json.dll

User user = JavaScriptConvert.DeserializeObject(strJSON,typeof(User)) as User;

调用场景三:

  Android/Java调用服务,将Json反序列化,此处需要引用第三方jar包gson.jar。

User user = JsonHelper.parseObject(strJSON, User.class);

1.构建实体类

 1 public class User{
2 @Expose
3 public String UserName;
4 @Expose
5 public String NickName;
6 @Expose
7 public String Sex;
8 @Expose
9 public String Hobby;
10 @Expose
11 public Date Birthday;
12 }

2.封装的Json操作类

 1 /*
2 * @author 姚玉星
3 * Json相关类
4 */
5 public class JsonHelper {
6 // 反序列化json
7 public static <T> T parseObject(String jsonStr, Type type) {
8 GsonBuilder builder = new GsonBuilder();
9 // 不转换没有 @Expose 注解的字段
10 builder.excludeFieldsWithoutExposeAnnotation();
11 //由于gson没有反序列化Date的功能,此处自己构造一个DateTime的反序列化类,将其注册到GsonBuilder中
12 DateDeserializer ds = new DateDeserializer();
13 builder.registerTypeAdapter(Date.class, ds);
14 Gson gson = builder.create();
15 return gson.fromJson(jsonStr, type);
16 }
17 // 序列化Json
18 public static String toJson(Object object) {
19 GsonBuilder builder = new GsonBuilder();
20 // 不转换没有 @Expose 注解的字段
21 builder.excludeFieldsWithoutExposeAnnotation();
22 Gson gson = builder.create();
23 return gson.toJson(object);
24 }
25 }
26 class DateDeserializer implements JsonDeserializer<Date> {
27 public Date deserialize(JsonElement json, Type typeOfT,
28 JsonDeserializationContext context) throws JsonParseException {
29 String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/";
30 Pattern pattern = Pattern.compile(JSONDateToMilliseconds);
31 Matcher matcher = pattern.matcher(json.getAsJsonPrimitive()
32 .getAsString());
33 String result = matcher.replaceAll("$2");
34 return new Date(new Long(result));
35 }
36 }

反序列化 DateTime对象问题的更多相关文章

  1. DateTime对象反序列化的那些事

    今天在Android的Json反序列化过程中,Date类型无法转化成自己想要的格式,鉴于之前在C#的反序列话中也遇到过这个问题,解决的同时,顺手做个总结,供自己及需要的人日后查阅.       将Da ...

  2. C#序列化及反序列化Json对象通用类JsonHelper

    当今的程序界Json大行其道.因为Json对象具有简短高效等优势,广受广大C#码农喜爱.这里发一个序列化及反序列化Json对象通用类库,希望对大家有用. public class JsonHelper ...

  3. Java IO详解(六)------序列化与反序列化(对象流)

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  4. python中将datetime对象转化为时间戳

    从mongodb中读取出来的记录中,时间存储在datetime对象里,返回给客户端的却要求是时间戳格式,因此需要将对应的datetime时间转化为时间戳,从stackoverflow上找到同样的问题和 ...

  5. 《将一个字符串转换成datetime时,先分析该字符串以获取日期,然后再将每个变量放置到datetime对象中》的解决办法

    我们在写代码时,稍不注意就收到VS那文不对题的错误提示. 最近在项目上碰到了“将一个字符串转换成datetime时,先分析该字符串以获取日期,然后再将每个变量放置到datetime对象中”的这个错误提 ...

  6. python中datetime模块中datetime对象的使用方法

    本文只讲述datetime模块中datetime对象的一些常用的方法,如果读者需要更多datetime模块的信息,请查阅此文档. datetime模块的对象有如下: timedelta date da ...

  7. SQL SERVER中Datetime时间的范围与.net的DateTime对象的区别

    对于编写.net程序中我们一般写默认的时间,我们会自动创建一个new DateTime()对象.但与SQL SERVER连用我们就会出现一个时间范围的问题. 今天我就记录一下该时间问题. 我们创建的n ...

  8. 在MVC中使用Json.Net序列化和反序列化Json对象

    在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序 ...

  9. Serializer序列化/反序列化DateTime少了8小时问题解决

    1.举例子 JavascriptSerializer serializer = new JavascriptSerializer(); DateTime now = DateTime.Parse(&q ...

随机推荐

  1. 【转】.NET开发者必备的11款免费工具

    摘要:本文介绍一些最适合.NET开发人员简化Web开发的最佳工具,这些工具都是开源的,有的开发工具你既可以从网上下载可执行文件,也可以下载源代码.一些工具拥有可扩展的框架,是一个持续集成工具. 原文链 ...

  2. java web 组件Listenter(一)

    JavaWeb中监听器的事件源(ServletContext.HttpSession.ServletRequest.JavaBean) 1.ServletContext 生命周期监听:ServletC ...

  3. 转:聊聊并发(八)——Fork/Join框架介绍

    1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...

  4. 关于RESTful

    http://www.ruanyifeng.com/blog/2011/09/restful.html (1)每一个URI代表一种资源: (2)客户端和服务器之间,传递这种资源的某种表现层: (3)客 ...

  5. centos7安装VLC播放器

    centos7安装VLC播放器 1.安装eple 下载地址:https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noar ...

  6. web2.0的几个开源项目

    web2.0的几个开源项目   Diggclone-开源digg类程序官方:http://www.talkingpixels.org/diggclone/index.php演示:同digg.com类似 ...

  7. (转载)细说PHP中strlen和mb_strlen的区别

    (转载)http://developer.51cto.com/art/201105/263103.htm 在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果 ...

  8. HDFS基础和java api操作

    1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS ...

  9. 【3】JAVA---地址App小软件(AddPanel.class)(表现层)

    添加地址信息界面. 年龄和地址必须是数字,否则会弹出窗口提示. 地址信息不能为空. /* * AddPanel.java * * Created on __DATE__, __TIME__ */ pa ...

  10. Matlab:拟合(2)

    非线性最小二乘拟合: 解法一:用命令lsqcurvefit function f = curvefun(x, tdata) f = x() + x()*exp() * tdata); %其中x() = ...