jsoniter大小写问题
来源:互联网 发布:sxsoft软件项目交易网 编辑:程序博客网 时间:2024/05/17 06:45
其实,也不算大小写问题吧。具体是,对象属性与setter字段大小写一致时,jsoniter解析会不成功(至少在两层嵌套的json对象,且待解析字符串为大写情况下),如下的OBJECTS、setOBJECTS
public class NestedObject { public List<SimpleObject> OBJECTS; public List<SimpleObject> getOBJECTS() { return OBJECTS; } public void setOBJECTS(List<SimpleObject> OBJECTS) { this.OBJECTS = OBJECTS; }}
最项目传过来的数据都是大写的,如果增加一层大小写转换再jsoniter,感觉亏得慌。
然后就跑去看作者的源码,代码量不多,jsoniter解析是由javasist动态生成的中间码,详情请看jsoniter官网:
http://jsoniter.com/benchmark.html#optimization-used
经调试,如下:
关键函数:
private static void appendFieldSet(StringBuilder lines, String cacheKey, ConstructorDescriptor ctor, List<Binding> fields, Binding field) { //set字段、属性字段大小写一致时,程序会出错(属性字段=null) if (ctor.parameters.isEmpty() && fields.contains(field)) { if (!shouldReuseObject(field.valueType)) { append(lines, String.format("com.jsoniter.CodegenAccess.setExistingObject(iter, obj.%s);", field.name)); } append(lines, String.format("obj.%s = %s;", field.name, genField(field, cacheKey))); } else { append(lines, String.format("_%s_ = %s;", field.name, genField(field, cacheKey))); } }
再看后续转换码(正常部分):
java.util.List _objects_ = null;.........while (com.jsoniter.CodegenAccess.nextToken(iter) == ',') {switch (com.jsoniter.CodegenAccess.readObjectFieldAsHash(iter)) {case -226370165: com.jsoniter.CodegenAccess.setExistingObject(iter, obj.OBJECTS);obj.OBJECTS = (java.util.List)decoder.java.util.List.decode_(iter);continue;case -1463410581: _objects_ = (java.util.List)decoder.java.util.List_com.jsoniter.SimpleObject.decode_(iter);continue;}iter.skip();}obj.setobjects(_objects_);return obj;}
如果大小写相同,会缺少
“`sequence
objects = (java.util.List)decoder.java.util.List_com.jsoniter.SimpleObject.decode_(iter);
““
解决小技巧:
注释掉getSetters函数以下行
fromNameChars[0] = Character.toLowerCase(fromNameChars[0]);
同样注释掉getGetters相类似行,并将json对象成员属性改为小写,set字段大写即可,如下:
public class NestedObject { public List<SimpleObject> objects; public List<SimpleObject> getOBJECTS() { return objects; } public void setOBJECTS(List<SimpleObject> OBJECTS) { this.objects = OBJECTS; }}
0 0
- jsoniter大小写问题
- 大小写问题
- Jsoniter简单的使用介绍
- mysql 大小写问题
- mysql 大小写问题
- SQL语句大小写问题
- svn 大小写问题
- 查询SQL大小写问题
- mysql的大小写问题
- URL 大小写问题
- php大小写敏感问题
- MySQL大小写问题
- PostgreSQL大小写排序问题
- MySQL大小写问题
- mysql 的大小写问题
- SYBASE大小写问题
- 人民币大小写转换问题
- batis 大小写问题
- html相关的扩展阅读--持续更新中。。。
- android:windowSoftInputMode
- Android触摸事件的分发(传递)机制(图文)
- [POJ2891] Strange Way to Express Integers
- org/i0itec/zkclient/exception/zknonodeexception zookeeper dubbo
- jsoniter大小写问题
- Windows下通过VMware向虚拟机传输文件
- 日志输出框架Log4j
- Android超级炫酷的轮播图实现
- Python yield 使用浅析
- ApplicationContextAware接口
- 版本分类
- IOS中使用腾讯Bugly
- Java或Web中解决所有路径问题