国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

json-lib反序列化時(shí)(JSONObject.toBean),時(shí)間類型為空的處理

2019-11-14 20:54:05
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
json-lib反序列化時(shí)(JSONObject.toBean),時(shí)間類型為空的處理 Posted on 2014-08-15 12:04 南小爵 閱讀(...) 評(píng)論(...) 編輯 收藏

需求:

在我們的項(xiàng)目里希望JsonString傳入日期類型值為空時(shí),JSONObject.toBean時(shí)可以將java對(duì)象的該日期屬性設(shè)為null。

解決過(guò)程:

json-lib反序列化Json字符串為Java對(duì)象,可以通過(guò)以下代碼處理日期字段:

1 public static <T> T JsonToBean(Class<T> clazz, String JsonString) {2         JSONUtils.getMorpherRegistry().registerMorpher(3                 new DateMorpher(new String[] { "yyyy-MM-dd HH:mm:ss",4                         "yyyy-MM-dd", "yyyy-MM-dd't'HH:mm:ss" }));5         JSONObject jsonObject = JSONObject.fromObject(JsonString);6         T entity = (T) JSONObject.toBean(jsonObject, clazz);7         return entity;8     }
View Code

但如果JsonString傳入{"createDate":""}時(shí),則會(huì)在“T entity = (T) JSONObject.toBean(jsonObject, clazz)”時(shí)報(bào)以下錯(cuò)誤:

net.sf.json.JSONException: Error while setting PRoperty=createDate type class java.lang.String

查看net.sf.ezmorph.object.DateMorpher方法的源碼,關(guān)于字符串轉(zhuǎn)時(shí)間的代碼如下:

 1       public Object morph(Object value) 2        { 3          if (value == null) { 4            return null; 5          } 6   7          if (Date.class.isAssignableFrom(value.getClass())) { 8            return (Date)value; 9          }10  11          if (!supports(value.getClass())) {12            throw new MorphException(value.getClass() + " is not supported");13          }14  15          String strValue = (String)value;16          SimpleDateFormat dateParser = null;17  18          for (int i = 0; i < this.formats.length; ++i) {19            if (dateParser == null)20              dateParser = new SimpleDateFormat(this.formats[i], this.locale);21            else {22              dateParser.applyPattern(this.formats[i]);23            }24            dateParser.setLenient(this.lenient);25            try {26              return dateParser.parse(strValue.toLowerCase());27            }28            catch (ParseException localParseException)29            {30            }31          }32  33          if (super.isUseDefault()) {34            return this.defaultValue;35          }36          throw new MorphException("Unable to parse the date " + value);37        }
View Code

可以看到,在18~32行會(huì)使用我們傳入的formats循環(huán)進(jìn)行字符串轉(zhuǎn)換,如果轉(zhuǎn)換成功則返回Date,如果全部失敗則在37行處拋出異常,最后導(dǎo)致toBean方法失敗。

可以看到DateMorpher類有這個(gè)構(gòu)造函數(shù)可以傳入Date defaultValue,在morph方法的第34行如果之前的轉(zhuǎn)換均失敗即返回defaultValue。但使用(Date)null作為defaultValue,在初始化DateMorpher對(duì)象時(shí)會(huì)報(bào)空指針異常,原因是DateMorpher類中有如下方法:

1   public void setDefaultValue(Date defaultValue)2       {3           this.defaultValue = ((Date)defaultValue.clone());4       }5 6       public Date getDefaultValue()7       {8           return (Date)this.defaultValue.clone();9       }
View Code

“this.defaultValue.clone();”中defaultValue 為null所以報(bào)異常。

解決方法:

重新實(shí)現(xiàn)DateMorpher方法,修改setDefaultValue(Date defaultValue)和getDefaultValue()方法,對(duì)null進(jìn)行處理

(當(dāng)然也可是修改net.sf.ezmorph.object.DateMorpher方法,重新打包ezmorph-1.0.6.jar)。

以下是重新實(shí)現(xiàn)的DateMorpherEx方法:

  1 import net.sf.ezmorph.object.AbstractObjectMorpher;  2 import java.text.DateFormat;  3 import java.text.ParseException;  4 import java.text.SimpleDateFormat;  5 import java.util.Date;  6 import java.util.Locale;  7 import net.sf.ezmorph.MorphException;  8 import org.apache.commons.lang.builder.EqualsBuilder;  9 import org.apache.commons.lang.builder.HashCodeBuilder; 10  11 public class DateMorpherEx extends AbstractObjectMorpher { 12  13     private Date defaultValue; 14       private String[] formats; 15       private boolean lenient; 16       private Locale locale; 17  18       public DateMorpherEx(String[] formats) 19       { 20         this(formats, Locale.getDefault(), false); 21       } 22  23       public DateMorpherEx(String[] formats, boolean lenient) 24       { 25         this(formats, Locale.getDefault(), lenient); 26       } 27  28       public DateMorpherEx(String[] formats, Date defaultValue) 29       { 30         this(formats, defaultValue, Locale.getDefault(), false); 31       } 32  33       public DateMorpherEx(String[] formats, Date defaultValue, Locale locale, boolean lenient) 34       { 35         super(true); 36         if ((formats == null) || (formats.length == 0)) { 37           throw new MorphException("invalid array of formats"); 38         } 39  40         this.formats = formats; 41  42         if (locale == null) 43           this.locale = Locale.getDefault(); 44         else { 45           this.locale = locale; 46         } 47  48         this.lenient = lenient; 49         setDefaultValue(defaultValue); 50       } 51  52       public DateMorpherEx(String[] formats, Locale locale) 53       { 54         this(formats, locale, false); 55       } 56  57       public DateMorpherEx(String[] formats, Locale locale, boolean lenient) 58       { 59         if ((formats == null) || (formats.length == 0)) { 60           throw new MorphException("invalid array of formats"); 61         } 62  63         this.formats = formats; 64  65         if (locale == null) 66           this.locale = Locale.getDefault(); 67         else { 68           this.locale = locale; 69         } 70  71         this.lenient = lenient; 72       } 73  74       public boolean equals(Object obj) 75       { 76         if (this == obj) { 77           return true; 78         } 79         if (obj == null) { 80           return false; 81         } 82  83         if (!(obj instanceof DateMorpherEx)) { 84           return false; 85         } 86  87         DateMorpherEx other = (DateMorpherEx)obj; 88         EqualsBuilder builder = new EqualsBuilder(); 89         builder.append(this.formats, other.formats); 90         builder.append(this.locale, other.locale); 91         builder.append(this.lenient, other.lenient); 92         if ((super.isUseDefault()) && (other.isUseDefault())) { 93           builder.append(getDefaultValue(), other.getDefaultValue()); 94           return builder.isEquals(); 95         }if ((!super.isUseDefault()) && (!other.isUseDefault())) { 96           return builder.isEquals(); 97         } 98         return false; 99       }100 101       public Date getDefaultValue()102       {103           if(this.defaultValue!=null)104               return (Date)this.defaultValue.clone();105           else106               return this.defaultValue;107       }108 109       public int hashCode()110       {111         HashCodeBuilder builder = new HashCodeBuilder();112         builder.append(this.formats);113         builder.append(this.locale);114         builder.append(this.lenient);115         if (super.isUseDefault()) {116           builder.append(getDefaultValue());117         }118         return builder.toHashCode();119       }120 121       public Object morph(Object value)122       {123         if (value == null) {124           return null;125         }126 127         if (Date.class.isAssignableFrom(value.getClass())) {128           return (Date)value;129         }130 131         if (!supports(value.getClass())) {132           throw new MorphException(value.getClass() + " is not supported");133         }134 135         String strValue = (String)value;136         SimpleDateFormat dateParser = null;137 138         for (int i = 0; i < this.formats.length; ++i) {139           if (dateParser == null)140             dateParser = new SimpleDateFormat(this.formats[i], this.locale);141           else {142             dateParser.applyPattern(this.formats[i]);143           }144           dateParser.setLenient(this.lenient);145           try {146             return dateParser.parse(strValue.toLowerCase());147           }148           catch (ParseException localParseException)149           {150           }151 152         }153 154         if (super.isUseDefault()) {155           return this.defaultValue;156         }157         throw new MorphException("Unable to parse the date " + value);158       }159 160       public Class morphsTo()161       {162         return Date.class;163       }164 165       public void setDefaultValue(Date defaultValue)166       {167           if(defaultValue!=null)168               this.defaultValue = ((Date)defaultValue.clone());169           else170               this.defaultValue = null;171       }172 173       public boolean supports(Class clazz)174       {175         return String.class.isAssignableFrom(clazz);176       }177 }
View Code

修改原JsonToBean 方法,調(diào)用DateMorpherEx:

1 public static <T> T JsonToBean(Class<T> clazz, String JsonString) {2         JSONUtils.getMorpherRegistry().registerMorpher(3                 new DateMorpherEx(new String[] { "yyyy-MM-dd HH:mm:ss",4                         "yyyy-MM-dd", "yyyy-MM-dd't'HH:mm:ss" }, (Date) null));//調(diào)用DateMorpherEx,defaultValue為null5         JSONObject jsonObject = JSONObject.fromObject(JsonString);6         T entity = (T) JSONObject.toBean(jsonObject, clazz);7         return entity;8     }
View Code


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青阳县| 中西区| 开远市| 千阳县| 平昌县| 芷江| 珲春市| 白银市| 乌审旗| 恭城| 利辛县| 安溪县| 永顺县| 灵川县| 汪清县| 年辖:市辖区| 康乐县| 咸宁市| 光泽县| 陵水| 宣恩县| 新民市| 梓潼县| 福海县| 县级市| 贺州市| 沂源县| 华容县| 天峨县| 长岛县| 东乌珠穆沁旗| 科技| 甘谷县| 西城区| 都匀市| 明溪县| 城固县| 井陉县| 镇江市| 宜阳县| 西和县|