用json时的一个问题,

问题描述

假设有一个Person类, public class Person{ private java.util.Date birthday; // settor and gettor methods..... }现在客户端那边传来如下的json规则的字符串String personJson = "{birthday:"06/28/2008 17:00:00"}",要用 JSONOjbect.toBean(JSONObject.from(personJson ),Person.class)方法来获得相应的Person实例时就出问题了,报错如下: 2008-6-19 13:57:39 net.sf.json.JSONObject morphPropertyValue警告: Can't transform property 'birthday' from java.lang.String into java.util.Date. Will register a default Morpher2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph信息: Property 'java.util.Date.class' has no write method. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.date' does not exist. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph信息: Property 'java.util.Date.day' has no write method. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.hours' does not exist. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.minutes' does not exist. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.month' does not exist. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.seconds' does not exist. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.time' does not exist. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph信息: Property 'java.util.Date.timezoneOffset' has no write method. SKIPPED.2008-6-19 13:57:39 net.sf.ezmorph.bean.BeanMorpher morph警告: Property 'java.lang.String.year' does not exist. SKIPPED.Person's brithday: Thu Jun 19 13:57:39 CST 2008 这个怎么解决?以下是我做实验用的Java代码:=======================package json;import java.util.Date;import net.sf.json.JSONObject;public class Person {private Date birthday;public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public static Person getInstance(String jsonVale) {return (Person)JSONObject.toBean(JSONObject.fromObject(jsonVale),Person.class);}public static void main(String[] args) {String personJson = "{birthday:"06/28/2008 17:00:00"}";Person p = getInstance(personJson);System.out.println("Person's brithday: "+ p.getBirthday());}}问题补充:To ham: 你所说的那个方案是针对 bean --> Json的,而现在的问题是从Json到Bean.问题补充:多谢各位的帮忙,现在这个问题解决了,也就是在toBean前加一句话:JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(new String[] {"MM/dd/yyyy HH:mm:ss"}) );来配置记下Date转化时的Morpher就OK了,大家有兴趣的话可以试下.Thanks a lot!

解决方案

到网上Google了一下午,一点相关的资料都没找到.写了一个傻办法,先将就着用吧:package test;import java.util.Date; import net.sf.json.JSONObject; public class Person { private Date birthday; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public static Person getInstance(String jsonValue) { JSONObject obj=JSONObject.fromObject(jsonValue); //将birthday属性获取到 String strDate=(String)obj.get("birthday"); Date newDate=null; //设置日期转换的格式 java.text.DateFormat formate = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { newDate = formate.parse(strDate); }catch (Exception e) { e.printStackTrace(); } //移除原有的birthday属性 obj.remove("birthday"); //将日期类型的birthday放到obj中 obj.put("birthday", newDate); return (Person)JSONObject.toBean(obj,Person.class); } public static void main(String[] args) { String personJson = "{birthday:"2008-06-28 17:00:00"}"; Person p = getInstance(personJson); System.out.println("Person's brithday: "+p.getBirthday()); }}输出结果为:引用Person's brithday: Sat Jun 28 17:00:00 CST 20082008-6-20 16:45:11 net.sf.json.JSONObject toBean警告: Property 'day' has no write method. SKIPPED.2008-6-20 16:45:11 net.sf.json.JSONObject toBean警告: Property 'timezoneOffset' has no write method. SKIPPED.那两个警告好像是因为在toBean()的时候,它把Date对象也当成了一个JSONObject对象进行处理.由于没有set方法而出现的.我对java对json的操作也只是处于一知半解的状态,如果写的代码太幼稚.楼主表笑...
解决方案二:
用mozilla的rhino库,如果jdk1.6的话已经自带了。执行json的脚本,然后构造你的Bean。
解决方案三:
上面的BeanUtils.setBeanPropertyByName也说明下:public class BeanUtils { public static <T> void setBeanPropertyByName(T entity, String propertyName, String propertyValue) { PropertyDescriptor propertyDescriptor = new PropertyDescriptor(propertyName, entity.getClass());Class propertyType = propertyDescriptor.getPropertyType();Method setMethod = propertyDescriptor.getWriteMethod(); if (propertyType == java.sql.Date.class) {setMethod.invoke(entity, DateUtils.getSqlDateFromString(propertyValue, "yyyy-MM-dd HH:mm:ss"));} else ... }}
解决方案四:
{birthday:"06/28/2008 17:00:00"}Wrong{"birthday":"06/28/2008 17:00:00"}right
解决方案五:
用反射逐个调用for (Object object : jsonObject.entrySet()) { Map.Entry entry = (Map.Entry) object; String propertyName = entry.getKey().toString(); String propertyValue = entry.getValue().toString(); BeanUtils.setBeanPropertyByName(entity, propertyName, propertyValue);}
解决方案六:
要不你就手工处理下personJson里的时间日期部分``
解决方案七:
汗...地址搞错鸟.解决的方法可以参见: http://bolingsky.blog.sohu.com/74165282.html里面有详细的代码.
解决方案八:
这是因为你在json中的字符串类型的"06/28/2008 17:00:00"在java中没有办法直接转换成为Date类型的数据.因而报出了异常你需要通过JsonValueProcessor类,进行日期的转换格式.详细的内容可以参见:http://www.iteye.com/topic/169094里面有详细代码.

时间: 2024-09-14 19:42:15

用json时的一个问题,的相关文章

浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号_javascript技巧

1 C,C++,Java,PHP都能容忍末尾的逗号 C,C++,Java中对数组赋值时,最后一个元素末尾的逗号可有可无.下面两行代码对这些语言来说是等效的. int a[] = {1,2,3}; /* 正确 */ int a[] = {1,2,3,}; /* 正确 */ PHP这一点也继承了C的特点,下面的两行代码等效. $a = array(1,2,3); /* 正确 */ $a = array(1,2,3,); /* 正确 */ 2 JavaScript视末尾逗号为语法错误! 然而到了Jav

在java项目中的mongodb的_id被fastjson转为json时竟然丢失了

fastjson是阿里开发的一个javaBean和json解析器和封装器(源码位置),用过几次感觉挺好用的,也是国人的开源项目当然得支持,但最近项目在使用mongodb作为数据库时出现了_id丢失的问题,现将我遇到的问题和解决办法展示一下. 现将错误的程序代码添加上,然后再提供解决方法: package org.jivesoftware.openfire.plugin.friends.test; import org.bson.types.ObjectId; import org.jivesof

java-json-lib 操作 json 时 element 方法的问题。

问题描述 json-lib 操作 json 时 element 方法的问题. 3C 最近刚开始用json-lib操作json,但遇到一个问题: 先说说为JSONObject添加属性的3个方法的官方解释: public Object put (Object key Object value):--将value映射到key下.如果此JSONObject对象之前存在一个value在这个key下,当前的value会替换掉之前的value. public JSONObject accumulate (St

JS中Eval解析JSON字符串的一个小问题_javascript技巧

之前写过一篇 关于 JSON 的介绍文章,里面谈到了 JSON 的解析.我们都知道,高级浏览器可以用 JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据,稍微欠妥点的做法,我们可以用eval() 函数. JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包. JSON的规则很简单:

Jquery跨域获得Json时invalid label错误的解决办法_jquery

最后,仔细安静下来,细读 json 官方文档后发现这么一段: JSON数据是一种能很方便通过JavaScript解析的结构化数据.如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型.使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面.服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求.如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp

用npm安装package.json时出现错误

问题描述 用npm安装package.json时出现错误 我是在win8 64bit上面操作,本来安装的nodejs是64位的, npm install时一直出现错误,上网查后有说要安装32位的,而且需要安装vs, 于是我卸载64的node又安装32的node,又安装vs2012, 然后又npm install 出现如下异常: npm WARN optional dep failed, continuing fsevents@0.3.8 > spawn-sync@1.0.13 postinsta

装SDK时遇到一个非常奇怪的问题,各位都来瞧一瞧,指点一下

问题描述 装SDK时遇到一个非常奇怪的问题,各位都来瞧一瞧,指点一下 装Android4.0以上的时候没有任何问题,但是装4.0以下版本全部显示与windows不兼容.....这是什么鬼?以前从未遇到过啊 解决方案 集成tiles3时遇到的问题mark一下 解决方案二: http://blog.csdn.net/pathuang68/article/details/8233107

android-触摸移动时移动一个视图 (ACTION_MOVE)

问题描述 触摸移动时移动一个视图 (ACTION_MOVE) 我想做一个简单的控件:容器中有一个视图.如果我触摸容器移动手指,我想让视图跟着我的手指移动.我应该使用什么样的容器(布局)?我不需要使用一个界面,只要一个简单的布局.如何做到这一点呢? 解决方案 在main.xml用""@+id/root""来设置RelativeLayout public class MyActivity extends Activity implements View.OnTouchL

nodejs-npm安装package.json时repository为空

问题描述 npm安装package.json时repository为空 在编辑package.json 时,请问如果repository为空,那么npm会去哪里找repository"" : { ""type"" : ""git"" url"" : """" } 解决方案 google下,从别的地方下载 解决方案二: npm官网或GitHub