java下jsonjava接收json数据格式的String型数据怎么转化成UFDate型的。

解决json日期格式问题的3种方法
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了解决json日期格式问题的3种方法 ,需要的朋友可以参考下
开发中有时候需要从服务器端返回json格式的数据,在后台代码中如果有DateTime类型的数据使用系统自带的工具类序列化后将得到一个很长的数字表示日期数据,如下所示:
代码如下://设置服务器响应的结果为纯文本格式&&&&&&&&&&& context.Response.ContentType = "text/plain";&&&&&&&&&& //学生对象集合&&&&&&&&&&& List&Student& students = new List&Student&&&&&&&&&&&& {&&&&&&&&&&&&&&& new Student(){Name ="Tom",&&&&&&&&&&&&&&&&&&& Birthday =Convert.ToDateTime(" 12:12:12")},&&&&&&&&&&&&&&& new Student(){Name ="Rose",&&&&&&&&&&&&&&&&&&& Birthday =Convert.ToDateTime(" 11:12:12")},&&&&&&&&&&&&&&& new Student(){Name ="Mark",&&&&&&&&&&&&&&&&&&& Birthday =Convert.ToDateTime(" 10:12:12")}&&&&&&&&&&& };
&&&&&&&&&&& //javascript序列化器&&&&&&&&&&& JavaScriptSerializer jss=new JavaScriptSerializer();&&&&&&&&&& //序列化学生集合对象得到json字符&&&&&&&&&&& string studentsJson=jss.Serialize(students);&&&&&&&&&& //将字符串响应到客户端&&&&&&&&&&& context.Response.Write(studentsJson);&&&&&&&&&& context.Response.End();
运行结果是:
其中Tom所对应生日“”变成了0,这其实是1970 年 1 月 1 日至今的毫秒数;0//24/365=44.11年,44+年,按这种方法可以得出年月日时分秒和毫秒。这种格式是一种可行的表示形式但不是普通人可以看懂的友好格式,怎么让这个格式变化?
解决办法:
方法1:在服务器端将日期格式使用Select方法或LINQ表达式转换后发到客户端:
代码如下:using Susing System.Collections.Gusing System.W
using System.Web.Script.S
namespace JsonDate1{&&& using System.L
&&& /// &summary&&&& /// 学生类,测试用&&& /// &/summary&&&& public class Student&&& {&&&&&&& /// &summary&&&&&&&& /// 姓名&&&&&&& /// &/summary&&&&&&&& public String Name { }
&&&&&&& /// &summary&&&&&&&& /// 生日&&&&&&& /// &/summary&&&&&&&& public DateTime Birthday { }&&& }
&&& /// &summary&&&& /// 返回学生集合的json字符&&& /// &/summary&&&& public class GetJson : IHttpHandler&&& {&&&&&&& public void ProcessRequest(HttpContext context)&&&&&&& {&&&&&&&&&&& //设置服务器响应的结果为纯文本格式&&&&&&&&&&& context.Response.ContentType = "text/plain";&&&&&&&&&&& //学生对象集合&&&&&&&&&&& List&Student& students = new List&Student&&&&&&&&&&&& {&&&&&&&&&&&&&&& new Student(){Name ="Tom",Birthday =Convert.ToDateTime(" 12:12:12")},&&&&&&&&&&&&&&& new Student(){Name ="Rose",Birthday =Convert.ToDateTime(" 11:12:12")},&&&&&&&&&&&&&&& new Student(){Name ="Mark",Birthday =Convert.ToDateTime(" 10:12:12")}&&&&&&&&&&& };
&&&&&&&&&&& //使用Select方法重新投影对象集合将Birthday属性转换成一个新的属性&&&&&&&&&&& //注意属性变化后要重新命名,并立即执行&&&&&&&&&&& var studentSet =&&&&&&&&&&&&&&& students.Select&&&&&&&&&&&&&&& (&&&&&&&&&&&&&&& p =& new { p.Name, Birthday = p.Birthday.ToString("yyyy-mm-dd") }&&&&&&&&&&&&&&& ).ToList();
&&&&&&&&&&& //javascript序列化器&&&&&&&&&&& JavaScriptSerializer jss = new JavaScriptSerializer();&&&&&&&&&&& //序列化学生集合对象得到json字符&&&&&&&&&&& string studentsJson = jss.Serialize(studentSet);&&&&&&&&&&& //将字符串响应到客户端&&&&&&&&&&& context.Response.Write(studentsJson);&&&&&&&&&&& context.Response.End();&&&&&&& }
&&&&&&& public bool IsReusable&&&&&&& {&&&&&&&&&&& get&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& }&&& }}
Select方法重新投影对象集合将Birthday属性转换成一个新的属性,注意属性变化后要重新命名,属性名可以相同;这里可以使用select方法也可以使用LINQ查询表达式,也可以选择别的方式达到相同的目的;这种办法可以将集合中客户端不用的属性剔除,达到简单优化性能的目的。 运行结果:
这时候的日期格式就已经变成友好格式了,不过在javascript中这只是一个字符串。
在javascript中将"Birthday":"\/Date(0)\/"中的字符串转换成javascript中的日期对象,可以将Birthday这个Key所对应的Value中的非数字字符以替换的方式删除,到到一个数字0,然后实例化一个Date对象,将0毫秒作为参数,得到一个javascript中的日期对象,代码如下:
代码如下:&!DOCTYPE html&&html xmlns="http://www.w3.org/1999/xhtml"&&head&&&& &title&json日期格式处理&/title&&&& &script src="Scripts/jquery-1.10.2.min.js" type="text/javascript"&&/script&&&& &script type="text/javascript"&&&&&&&& $(function() {&&&&&&&&&&& $.getJSON("getJson.ashx", function (students) {&&&&&&&&&&&&&&& $.each(students, function (index, obj) {&&&&&&&&&&&&&&&&&&& $("&li/&").html(obj.Name).appendTo("#ulStudents");
&&&&&&&&&&&&&&&&&&& //使用正则表达式将生日属性中的非数字(\D)删除&&&&&&&&&&&&&&&&&&& //并把得到的毫秒数转换成数字类型&&&&&&&&&&&&&&&&&&& var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));&&&&&&&&&&&&&&&&&&& //实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数&&&&&&&&&&&&&&&&&&& var birthday = new Date(birthdayMilliseconds);
&&&&&&&&&&&&&&&&&&& $("&li/&").html(birthday.toLocaleString()).appendTo("#ulStudents"); ;&&&&&&&&&&&&&&& });&&&&&&&&&&& });&&&&&&& });&&& &/script&&/head&&body&&&& &h2&json日期格式处理&/h2&&&& &ul id="ulStudents"&&&& &/ul&&/body&&/html&
运行结果:
上的使用正则/\D/igm达到替换所有非数字的目的,\D表示非数字,igm是参数,分别表示忽视(ignore)大小写;多次、全局(global)替换;多行替换(multi-line);有一些时候还会出现+86的情况,只需要变换正则同样可以达到目的。另外如果项目中反复出现这种需要处理日期格式的问题,可以扩展一个javascript方法,代码如下:
代码如下:$(function () {&&&&&&&&&&& $.getJSON("getJson.ashx", function (students) {&&&&&&&&&&&&&&& $.each(students, function (index, obj) {&&&&&&&&&&&&&&&&& $("&li/&").html(obj.Name).appendTo("#ulStudents");
&&&&&&&&&&&&&&&&& //使用正则表达式将生日属性中的非数字(\D)删除&&&&&&&&&&&&&&&&&&& //并把得到的毫秒数转换成数字类型&&&&&&&&&&&&&&&&&&& var birthdayMilliseconds = parseInt(obj.Birthday.replace(/\D/igm, ""));&&&&&&&&&&&&&&&&& //实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数&&&&&&&&&&&&&&&&&&& var birthday = new Date(birthdayMilliseconds);
&&&&&&&&&&&&&&&&& $("&li/&").html(birthday.toLocaleString()).appendTo("#ulStudents");&&&&&&&&&&&&&&&&& $("&li/&").html(obj.Birthday.toDate()).appendTo("#ulStudents");&&&&&&&&&&&&&&& });&&&&&&&&&&& });&&&&&&& });
&&&&&&& //在String对象中扩展一个toDate方法,可以根据要求完善&&&&&&& String.prototype.toDate = function () {&&&&&&&&&&& var dateM&&&&&&&&&&& if (isNaN(this)) {&&&&&&&&&&&&&&& //使用正则表达式将日期属性中的非数字(\D)删除&&&&&&&&&&&&&&& dateMilliseconds =this.replace(/\D/igm, "");&&&&&&&&&&& } else {&&&&&&&&&&&&&&& dateMilliseconds=&&&&&&&&&&& }&&&&&&&&&&& //实例化一个新的日期格式,使用1970 年 1 月 1 日至今的毫秒数为参数&&&&&&&&&&& return new Date(parseInt(dateMilliseconds));&&&&&&& };
上面扩展的方法toDate不一定合理,也不够强大,可以根据需要修改。
可以选择一些第三方的json工具类,其中不乏有一些已经对日期格式问题已处理好了的,常见的json序列化与反序列化工具库有:
1.fastJSON.2.JSON_checker.3.Jayrock.4.Json.NET - LINQ to JSON.5.LitJSON.6.JSON for .NET.7.JsonFx.8.JSONSharp.9.JsonExSerializer.10.fluent-json11.Manatee Json
这里以litjson为序列化与反序列化json的工具类作示例,代码如下:
代码如下:using Susing System.Collections.Gusing System.W
using LitJ
namespace JsonDate2{&&& using System.L
&&& /// &summary&&&& /// 学生类,测试用&&& /// &/summary&&&& public class Student&&& {&&&&&&& /// &summary&&&&&&&& /// 姓名&&&&&&& /// &/summary&&&&&&&& public String Name { }
&&&&&&& /// &summary&&&&&&&& /// 生日&&&&&&& /// &/summary&&&&&&&& public DateTime Birthday { }&&& }
&&& /// &summary&&&& /// 返回学生集合的json字符&&& /// &/summary&&&& public class GetJson : IHttpHandler&&& {&&&&&&& public void ProcessRequest(HttpContext context)&&&&&&& {&&&&&&&&&&& //设置服务器响应的结果为纯文本格式&&&&&&&&&&& context.Response.ContentType = "text/plain";&&&&&&&&&&& //学生对象集合&&&&&&&&&&& List&Student& students = new List&Student&&&&&&&&&&&& {&&&&&&&&&&&&&&& new Student(){Name ="Tom",Birthday =Convert.ToDateTime(" 12:12:12")},&&&&&&&&&&&&&&& new Student(){Name ="Rose",Birthday =Convert.ToDateTime(" 11:12:12")},&&&&&&&&&&&&&&& new Student(){Name ="Mark",Birthday =Convert.ToDateTime(" 10:12:12")}&&&&&&&&&&& };
&&&&&&&&&&& //序列化学生集合对象得到json字符&&&&&&&&&&& string studentsJson = JsonMapper.ToJson(students);&&&&&&&&&&& //将字符串响应到客户端&&&&&&&&&&& context.Response.Write(studentsJson);&&&&&&&&&&& context.Response.End();&&&&&&& }
&&&&&&& public bool IsReusable&&&&&&& {&&&&&&&&&&& get&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&& }&&&&&&& }&&& }}
运行结果如下:
这时候的日期格式就基本正确了,只要在javascript中直接实例化日期就好了,
var date = new Date("01/31/:12");alert(date.toLocaleString());
客户端的代码如下:
代码如下:$(function () {&&&&&&&&&&& $.getJSON("GetJson2.ashx", function (students) {&&&&&&&&&&&&&&& $.each(students, function (index, obj) {&&&&&&&&&&&&&&&&&&& $("&li/&").html(obj.Name).appendTo("#ulStudents");
&&&&&&&&&&&&&&&&&&& var birthday = new Date(obj.Birthday);&&&&&&&&&&&&&&&&&&& $("&li/&").html(birthday.toLocaleString()).appendTo("#ulStudents");&&&&&&&&&&&&&&& });&&&&&&&&&&& });&&&&&&& });
&&&&&&& var date = new Date("01/31/:12");&&&&&&& alert(date.toLocaleString());
这里讲到了三种解决json中序列化后的日期格式问题,应该还有更好更完善的方法,欢迎您告诉我。因为有很多学生问我所以我写了这点文字,欢迎批评指正。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具1271人阅读
JAVA(103)
一、String与Date(java.util.Date)互转
&&&& 1.1 String -& Date
Java代码&&
String&dateStr&=&&&12:34:23&;&&
&&&&&&&&Date&date&=&new&Date();&&
&&&&&&&&&&
&&&&&&&&DateFormat&sdf&=&new&SimpleDateFormat(&yyyy/MM/dd&HH:mm:ss&);&&
&&&&&&&&try&{&&
&&&&&&&&&&&&date&=&sdf.parse(dateStr);&&
&&&&&&&&&&&&System.out.println(date.toString());&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
& 1.2 Date -& String
&&&日期向字符串转换,可以设置任意的转换格式format
Java代码&&
String&dateStr&=&&&;&&
&&&&&&&&Date&date&=&new&Date();&&
&&&&&&&&&&
&&&&&&&&DateFormat&sdf&=&new&SimpleDateFormat(&yyyy/MM/dd&HH:mm:ss&);&&
&&&&&&&&DateFormat&sdf2&=&new&SimpleDateFormat(&yyyy-MM-dd&HH/mm/ss&);&&
&&&&&&&&try&{&&
&&&&&&&&&&&&dateStr&=&sdf.format(date);&&
&&&&&&&&&&&&System.out.println(dateStr);&&
&&&&&&&&&&&&dateStr&=&sdf2.format(date);&&
&&&&&&&&&&&&System.out.println(dateStr);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&二、String与Timestamp互转
&& 2.1 String -&Timestamp
&& 使用Timestamp的valueOf()方法
Java代码&&
Timestamp&ts&=&new&Timestamp(System.currentTimeMillis());&&
&&&&&&&&String&tsStr&=&&&11:49:45&;&&
&&&&&&&&try&{&&
&&&&&&&&&&&&ts&=&Timestamp.valueOf(tsStr);&&
&&&&&&&&&&&&System.out.println(ts);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&&&注:String的类型必须形如:&yyyy-mm-dd hh:mm:ss[.f...] 这样的格式,中括号表示可选,否则报错!!!
&&& 如果String为其他格式,可考虑重新解析下字符串,再重组~~
&&& 2.2 Timestamp -& String
& 使用Timestamp的toString()方法或者借用DateFormat
Java代码&&
Timestamp&ts&=&new&Timestamp(System.currentTimeMillis());&&
&&&&&&&&String&tsStr&=&&&;&&
&&&&&&&&DateFormat&sdf&=&new&SimpleDateFormat(&yyyy/MM/dd&HH:mm:ss&);&&
&&&&&&&&try&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&tsStr&=&sdf.format(ts);&&
&&&&&&&&&&&&System.out.println(tsStr);&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&tsStr&=&ts.toString();&&
&&&&&&&&&&&&System.out.println(tsStr);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&很容易能够看出来,方法一的优势在于可以灵活的设置字符串的形式。
三、Date(&java.util.Date&)和Timestamp互转
& 声明:查API可知,Date和Timesta是父子类关系
& 3.1 Timestamp -& Date
Java代码&&
Timestamp&ts&=&new&Timestamp(System.currentTimeMillis());&&
&&&&&&&&Date&date&=&new&Date();&&
&&&&&&&&try&{&&
&&&&&&&&&&&&date&=&&&
&&&&&&&&&&&&System.out.println(date);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
&很简单,但是此刻date对象指向的实体却是一个Timestamp,即date拥有Date类的方法,但被覆盖的方法的执行实体在Timestamp中。
&& 3.2 Date -& Timestamp
&& 父类不能直接向子类转化,可借助中间的String~~~~
&& 注:使用以下方式更简洁
&& Timestamp ts = new Timestamp(date.getTime());
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6803302次
积分:60079
积分:60079
排名:第38名
原创:248篇
转载:2602篇
评论:645条
(17)(92)(17)(25)(37)(63)(7)(74)(67)(95)(177)(114)(86)(40)(43)(71)(14)(10)(17)(12)(6)(20)(27)(54)(71)(97)(74)(32)(2)(24)(21)(62)(60)(36)(23)(27)(46)(34)(76)(63)(121)(141)(74)(54)(120)(77)(42)(4)(12)(19)(1)(9)(15)(19)(18)(16)(31)(79)(68)转载自:/blog/2018901
返回json数据时,数据库中的Date类型是这种格式:&planTime&:{&date&:22,&day&:6,&hours&:0,&minutes&:0,&month&:3,&seconds&:0,&time&:0,&timezoneOffset&:-480,&year&:117}怎么转换成想要的yyyy-MM-dd格式呢?
import net.sf.json.JsonC
import net.sf.json.processors.JsonValueP
import java.text.SimpleDateF
import java.util.D
import java.util.L
* 时间转换器(将返回的json数据中的日期格式转换为指定格式)
* Created by
public class JsonDateValueProcessorUtil implements JsonValueProcessor {
private String format =&yyyy-MM-dd&;
public JsonDateValueProcessorUtil() {
public JsonDateValueProcessorUtil(String format) {
this.format =
public Object processArrayValue(Object paramObject,
JsonConfig paramJsonConfig) {
return process(paramObject);
public Object processObjectValue(String paramString, Object paramObject,
JsonConfig paramJsonConfig) {
return process(paramObject);
private Object process(Object value){
if(value instanceof Date){
SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.CHINA);
return sdf.format(value);
return value == null ? && : value.toString();
然后在转换json数据的地方:Flexigrid flexigrid = superviseService.queryPage(pageNumInt,pageSizeInt,supervise);
List&Supervise& list = (List&Supervise&) flexigrid.getRows();
int total = flexigrid.getTotal();
int page = flexigrid.getPage();
int rowStart = flexigrid.getRowStart();
int rowEnd = flexigrid.getRowEnd();
int rp = flexigrid.getRp();
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.class, new JsonDateValueProcessorUtil());
JSONArray array = JSONArray.fromObject(list,jsonConfig);
&planTime&:&&
返回的日期格式就是我们指定的yyyy-MM-dd了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:21409次
排名:千里之外
原创:35篇
转载:32篇
(1)(5)(10)(6)(11)(4)(1)(3)(1)(14)(4)(1)(3)(1)(2)Date类型字段转换为json时的问题(转载)
在将java.util.Date
类型字段转为json时,获取时取到的日期为[object object] ,无法进行操作。
Java代码 &
Tariff&bean&=&new&Tariff();&&
bean.setName("Robby");&&
bean.setAge(1);&&
bean.setBorn(new&Date());&&
&当使用JSONObject
jsonObject =
JSONObject.fromObject(bean)转换为json时,jsp页面接收到的born日期类型为[object
object],无法获取具体日期!
解决方法:添加自定义的日期格式转化类
Java代码 &
package&com.techson.himsnanhwa.admin.&&
import&java.text.SimpleDateF&&
import&java.util.D&&
import&java.util.L&&
import&net.sf.json.JsonC&&
import&net.sf.json.processors.JsonValueP&&
public&class&JsonDateValueProcessor&implements&JsonValueProcessor&{&&
&&&&private&String&format&="yyyy-MM-dd";&&
&&&&public&Object&processArrayValue(Object&value,&JsonConfig&config)&{&&
&&&&&&&&return&process(value);&&
&&&&public&Object&processObjectValue(String&key,&Object&value,&JsonConfig&config)&{&&
&&&&&&&&return&process(value);&&
&&&&private&Object&process(Object&value){&&
&&&&&&&&&&
&&&&&&&&if(value&instanceof&Date){&&
&&&&&&&&&&&&SimpleDateFormat&sdf&=&new&SimpleDateFormat(format,Locale.UK);&&
&&&&&&&&&&&&return&sdf.format(value);&&
&&&&&&&&}&&
&&&&&&&&return&value&==&null&?&""&:&value.toString();&&
&类名JsonDateValueProcessor自定义,继承的JsonValueProcessor是固定写法。
Java代码 &
Tariff&bean&=&new&Tariff();&&
bean.setName("Robby");&&
bean.setAge(1);&&
bean.setBorn(new&Date());&&
JsonConfig&jsonConfig&=&new&JsonConfig();&&&//JsonConfig是net.sf.json.JsonConfig中的这个,为固定写法&&
jsonConfig.registerJsonValueProcessor(Date.class&,&new&JsonDateValueProcessor());&&
JSONObject&jo&=&JSONObject.fromObject(bean,&jsonConfig);&&
System.out.println("json:"&+&jo.toString());&&
结果:json:{"age":1,"born":"","name":"Robby"}&&
&也可以通过为日期转换类加上构造函数,使用
Java代码 &
jsonConfig.registerJsonValueProcessor(java.util.Date.class,&new&JsonDateValueProcessor("yyyy-MM-dd"));&&
&这种方式获取。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 java如何接收json数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信