今天在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.构建实体类

 public class User{
     @Expose
     public String UserName;
     @Expose
     public String NickName;
     @Expose
     public String Sex;
     @Expose
     public String Hobby;
     @Expose
     public Date Birthday;
 }

2.封装的Json操作类

 /*
  * @author 姚玉星
  * Json相关类
  */
 public class JsonHelper {
     // 反序列化json
     public static <T> T parseObject(String jsonStr, Type type) {
         GsonBuilder builder = new GsonBuilder();
         // 不转换没有 @Expose 注解的字段
         builder.excludeFieldsWithoutExposeAnnotation();
         //由于gson没有反序列化Date的功能,此处自己构造一个DateTime的反序列化类,将其注册到GsonBuilder中
         DateDeserializer ds = new DateDeserializer();
         builder.registerTypeAdapter(Date.class, ds);
         Gson gson = builder.create();
         return gson.fromJson(jsonStr, type);
     }
     // 序列化Json
     public static String toJson(Object object) {
         GsonBuilder builder = new GsonBuilder();
         // 不转换没有 @Expose 注解的字段
         builder.excludeFieldsWithoutExposeAnnotation();
         Gson gson = builder.create();
         return gson.toJson(object);
     }
 }
  class DateDeserializer implements JsonDeserializer<Date> {
     public Date deserialize(JsonElement json, Type typeOfT,
             JsonDeserializationContext context) throws JsonParseException {
         String JSONDateToMilliseconds = "\\/(Date\\((.*?)(\\+.*)?\\))\\/";
         Pattern pattern = Pattern.compile(JSONDateToMilliseconds);
         Matcher matcher = pattern.matcher(json.getAsJsonPrimitive()
                 .getAsString());
         String result = matcher.replaceAll("$2");
         return new Date(new Long(result));
     }
 }

DateTime对象反序列化的那些事的更多相关文章

  1. 反序列化 DateTime对象问题

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

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

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

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

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

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

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

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

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

  6. Redis | 使用redis存储对象反序列化异常SerializationFailedException

    案例 使用Redis进行对象存储,在处理业务逻辑的时候,丛Redis获取对象发现反序列化失败,抛出如下异常: Caused by: org.springframework.data.redis.ser ...

  7. Java基础之序列化对象——反序列化对象(DeserializeObjects)

    控制台程序,使用如下代码能读入包含Junk对象的文件: import java.io.*; import java.nio.file.*; class DeserializeObjects { pub ...

  8. Java如何转换protobuf-net中的bcl.DateTime对象

    一.定义DateTime Message 参考文档:https://github.com/mgravell/protobuf-net/blob/master/src/Tools/bcl.proto m ...

  9. 对象反序列化时,抛出java.io.StreamCorruptedException: invalid type code: AC异常

    问题描述:在使用java.io.ObjectInputStream类的readObject()方法去读取包含有序列化了多个(两个及两个以上)类的文件时,当读取到第二个类时,会抛出题目中提到的异常. 原 ...

随机推荐

  1. 带格式导出数据到Excel

    导出按钮事件 protected void Button1_Click(object sender, EventArgs e)    {        Response.Clear();        ...

  2. css画小米、遨游logo

    狠简单的2个Logo,用纯css写出来,觉得挺好玩的. <!DOCTYPE html> <html> <head> <meta charset="u ...

  3. Python3 如何优雅地使用正则表达式(详解三)

    模块级别的函数 使用正则表达式也并非一定要创建模式对象,然后调用它的匹配方法.因为,re 模块同时还提供了一些全局函数,例如 match(),search(),findall(),sub() 等等.这 ...

  4. 转:QT 的点点滴滴 错误总结

    转自:http://blog.csdn.net/lbsljn/archive/2009/12/29/5099590.aspx MinGw + CodeBlock + QT4.5 类定义后面要加&quo ...

  5. ISAP

    跑的是比Dinic快辣. 更新:指针版.... #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  6. Java CompletableFuture 详解

    Future是Java 5添加的类,用来描述一个异步计算的结果.你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执 ...

  7. eclipse svn插件安装

    1,在线直接安装 help --> Eclipse Marketplace 2,下载subclipse.zip 把features.plugins拷贝到eclipse安装目录 3,直接把subc ...

  8. java随机数生成器

    一.java.lang.Math.Random 调用这个Math.Random()函数能够返回带正号的double值,取值范围是[0.0,1.0)的左闭右开区间,并在该范围内(近似)均匀分布. 二.j ...

  9. kvm cobbler无人值守批量安装操作系统

    kvm cobbler无人值守批量安装操作系统 cobbler:一个自动网络安装系统的工具,集成PEX.dhcp.dns.tftpd.sync等服务.可以供大家管理安装操作系统 kvm:Linux系统 ...

  10. 查询rman备份信息经常使用指令

    查询rman备份信息经常使用指令 ----登陆到rman $rman target / ----以精简的格式查看备份信息 RMAN> list backup of database summar ...