首页 > 编程知识 正文

fastjson注解,fast json

时间:2023-05-05 11:30:59 阅读:145988 作者:1973

一直在FastJson上进行rest接口的序列化,FastJson的通用性支持也非常好。 使用一段时间后,我注意到了不定期的会报jsonobjectcan’tcovertto * * * *的错误,但重新启动后就好了。 故障诊断的过程不说明,直接出现在代码演示中

stringitemjsonstr=' {' models' : {' _ default model' : {' id' :824, ' itemname' ' 69 aefe 645 DC 0482 DBC ed 7a 234f 71 e0a9 ','Braack 'expand':null, ' yt item no' :' mdj phw-l54th http://static online.hipac.cn/item/201511/11231324205997.jpg', ' http://static online.hipac.cn/item/2007 日本销量No.1纸尿裤品牌、日本原装进口、海关监管、保税区直供! 专利网眼织物表面,透气性3倍,牢牢锁住轻薄柔软的粪便,让小屁股持久清爽舒适。 表层纤维配合天然植物精华,温柔呵护宝宝水润的肌肤。 适合体重9-14kg的宝宝。 ','netPrice':null,'transitFee':null,'minPrice':0.1, ' tax rate' 3333365265284; ' 33333333652365236500. ' specificationTOs':[], ' createtime' :1448256261000, ' edit time' 336014513000, ' itetime '每周优惠,花王,L54,尿不湿'}, '消息 ' :''默认模型 ' : {' id' :824, ' iteted ' 69 aefe 645 DC 0482 DBC ed 7a 234f 71 e0a9 ', ' brandid' :' e 096294 ba 3d b 4703972 f 26 ce82 d 64692', ' e 096529652965284; e 09652965284; 37096529484 ba 306; 'remarks':'",'locality':'日本 ','spec':'包装 ', ' pictures ' Other pictures' : [' http://sta AAR ]日本销量No.1纸尿裤品牌,日本原装进口,海关监管,保税区直供! 专利网眼织物表面,透气性3倍,牢牢锁住轻薄柔软的粪便,让小屁股持久清爽舒适。 表层纤维配合天然植物精华,温柔呵护宝宝水润的肌肤。 适合体重9-14kg的宝宝。 ','netPrice':null,'transitFee':null,'minPrice':0.1, ' tax rate' 3333365265284; ' 33333333652365236500. 规范tos' : [ ], ' createtime' :1448256261000,'editTime':1451300191000, ' itee //如果以下行清除注释并打印第二个,是真结果数据吗? resultfromclass=JSON object.parse object (itemjsonstr,newtypereferenceresultdata((}; system.out.println (resultfromclass.getdefaultmodel () instanceof JSONObject ); 结果数据? item result=JSON object.parse object (itemjsonstr,newtypereferenceresultdataitemto () {}.getType ); system.out.println (item result.getdefaultmodel ) (instanceof ItemTO ); 这样打印的结果为true,false。 但是,注释掉第一个parseObject,第二个打印true。 我们初步调试了FastJson的代码,但可能问题在于,缓存应该发生在类分析中

ParserConfig.java,getDeserializer方法

类型语言类型? (returngetdeserializer (() ) ) )类? (类型、类型); } if (类型instanceofparameterizedtype ) typerawtype=(parameterizedtype ).getRawType ); rawtypeinstanceofclass (射频)? (returngetdeserializer (() ) ) )类? )原始类型、类型; } else { returngetdeserializer (原始类型); }第一个if是否为class,第二个if是否为泛型,getRawType获取泛型并进入getDeserializer方法。 此方法具有缓存

if (typeinstanceofwildcardtype )

publicvoidputdeserializer (type type,ObjectDeserializer deserializer ) {derializers.put(type,deserializer; }您可以看到缓存的密钥是类型。

由此引起的问题:首先解析new TypeReference (),进行getDeserializer的第一个if,在putDeserializer方法中放入ResultData。 然后分析new TypeReferenceResultData ()。 此时,进行了getDeserializer的第二个if。 因为结果rawType是结果数据,所以直接从缓存返回了第一个分析的结果。 这相当于通用类型ItemTO丢失,最终类型转换失败。 中偶尔使用的原因是,大多数ResultData具有通用性,而ResultData很少具有通用性,因此调用不具有通用性的ResultData时会发生错误。

解决方案:除非统一使用泛型,并且项目中允许没有泛型的ResultData,否则就没有此问题。

我现在的解决方案是jar包裹最新的jar就可以了…人修复了作者: ykdsg

来源: CSDN

译文: 3359 blog.csdn.net/yk dsg/article/details/50432494

声明:本文为博客原创文章。 转载请附上博文链接!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。