JFinal 官方建议用驼峰字段,这是有原因的。官方说明如下截图:
假定我有一张user表,字段为 user_name,user_age
- 如果用官方默认的json输出,下划线的字段则不会做处理。输出格式如下:{user_name:"小明",user_age:18}
- 如果用FastJsonFactory输出,则输出的时候是{userName:"小明",userAge:18},这个时候问题来了,FastJsonFactory并不支持JFinal 的Record 对象输出。
- 还有一种混合模式MixedJsonFactory,这个支持Record,但输出格式仍然为第一种。
唯有自己根据MixedJsonFactory改造一下自己的JsonFactory了。单步调试了下MixedJsonFactory模式下renderJson的转化,发现JFinalJson class下面escape方法对key做了处理。
protected void escape(String s, StringBuilder sb) { for(int i=0; i= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F') || (ch >= '\u2000' && ch <= '\u20FF')) { String str = Integer.toHexString(ch); sb.append("\\u"); for(int k=0; k<4-str.length(); k++) { sb.append('0'); } sb.append(str.toUpperCase()); } else{ sb.append(ch); } } } }
我们可以知道"-"跑进了default case,我们只要处理一下“-”这个字符,并且才下一个字母变成大写,就可以达到我们的目的了。
protected void escape(String s, StringBuilder sb) { boolean isInitial = false; for(int i=0; i= 'a' && ch <= 'z'){ ch -= 32; } isInitial = false; sb.append(ch); continue; } if((ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F') || (ch >= '\u2000' && ch <= '\u20FF')) { String str = Integer.toHexString(ch); sb.append("\\u"); for(int k=0; k<4-str.length(); k++) { sb.append('0'); } sb.append(str.toUpperCase()); }else if(ch == '_'){ isInitial = true; }else{ sb.append(ch); } } } }