今天在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. 大整数算法[09] Comba乘法(原理)

    ★ 引子          原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...

  2. ora-01445 无法从不带保留关键字的表的联接视图中选择 ROWID 或采样

    ora-01445无法从不带保留关键字的表的联接视图中选择 ROWID 或采样 从网上找了很多资料,许多都是没结贴的,说什么的都有,排查了一下sql 发现各个段的left join都没有错误. 有一个 ...

  3. 转:支撑Github的开源技术

    原文来自于:http://www.infoq.com/cn/news/2014/03/projects-power-github Github在3月19号开放了新的项目展示页面(Showcase),S ...

  4. Android系统源代码下载

    最近,我在研究android,所以想下载android源代码看看.按照http://source.android.com/source/downloading.html 这个页面所提示的步骤在下载源代 ...

  5. 转: pthread_detach()函数

    创建一个线程默认的状态是joinable. 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码). 所以创建线程者应该调 ...

  6. 如何设置listview每个item高度

    据我所了解,listview每行的宽度是由 inflater填充布局中高度最大的那个控件的高度... public  void setListViewHeightBasedOnChildren(Lis ...

  7. ural 1215 Exactness of Projectile Hit

    #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> # ...

  8. 调试单片机内部扩展RAM

    51单片机内部只有128字节的RAM(8051),而8052有256字节的RAM,低128字节RAM直接或间接寻址都可以,高128字节RAM与SRF特殊功能寄存器共用地址,SFR只能直接寻址,高128 ...

  9. JavaScript 中的非真值

    False values 下面这些值将被计算出 false (also known as Falsy values): false undefined null 0 NaN 空字符串 ("& ...

  10. BZOJ1119: [POI2009]SLO

    1119: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 379  Solved: 181[Submit][Status] ...