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
经调试,如下:
ClassDescriptor中字段数

关键函数:

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
原创粉丝点击