今天在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. JavaScript 本地对象、内置对象、宿主对象

    首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...

  2. YesFinder - 网页文件管理系统 V2.0

    2.0版增加了模态框并重写了右键菜单插件.界面改为全中文.使用方式更加灵活. 同时,文件及目录改名更方便,直接双击名称就可改名. 这是DEMO的效果图. 1.功能上的主要改进是可以双击改文件/目录名称 ...

  3. nginx_笔记分享_配置篇

    参考http://www.howtocn.org/nginx:directiveindexhttp://blog.s135.com/ nginx 配置文档为 nginx.conf 比如我的配置文档 / ...

  4. Android Init进程命令的执行和服务的启动

    这里开始分析init进程中配置文件的解析,在配置文件中的命令的执行和服务的启动. 首先init是一个可执行文件,它的对应的Makfile是init/Android.mk. Android.mk定义了i ...

  5. C#中的委托和事件2-2(转)

    引言 如果你看过了 C#中的委托和事件2-1 一文,我想你对委托和事件已经有了一个基本的认识.但那些远不是委托和事件的全部内容,还有很多的地方没有涉及.本文将讨论委托和事件一些更为细节的问题,包括一些 ...

  6. 使用minidwep-gtk-PJ-wifi教程中文版

  7. Android的理解

    从组件的角度来考虑 Activity------------------Service-----------------Broadcast Receiver---------------------- ...

  8. Sum square difference

    简单: e sum of the squares of the first ten natural numbers is, 12 + 22 + ... + 102 = 385 The square o ...

  9. Altium Designer 导出Gerber文件详细教程

    Altium Designer 导出Gerber文件详细教程   1.用Altium打开需要导出Gerber文件的PCB: 2.点击“File”-“fabricatio Outputs ” “Gerb ...

  10. makefile工程管理

    个人理解吧,makefile就是写一个指定格式的文件,将一系列的编译.链接.转换等操作打包在一起,方便以后一键生成可执行的二进制文件而产生的.下面记录一下这种文件的写法,方便以后忘了来查询. make ...