文档章节

JFinal renderJson对下划线支持不够友好问题

小徐同学
 小徐同学
发布于 2017/07/24 15:45
字数 439
阅读 47
收藏 0

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<s.length(); i++){
			char ch = s.charAt(i);
			switch(ch){
			case '"':
				sb.append("\\\"");
				break;
			case '\\':
				sb.append("\\\\");
				break;
			case '\b':
				sb.append("\\b");
				break;
			case '\f':
				sb.append("\\f");
				break;
			case '\n':
				sb.append("\\n");
				break;
			case '\r':
				sb.append("\\r");
				break;
			case '\t':
				sb.append("\\t");
				break;
			//case '/':
			//	sb.append("\\/");
			//	break;
			default:
				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{
					sb.append(ch);
				}
			}
		}
	}

我们可以知道"-"跑进了default case,我们只要处理一下“-”这个字符,并且才下一个字母变成大写,就可以达到我们的目的了。

protected void escape(String s, StringBuilder sb) {
		boolean isInitial = false;
		for(int i=0; i<s.length(); i++){
			char ch = s.charAt(i);
			switch(ch){
			case '"':
				sb.append("\\\"");
				break;
			case '\\':
				sb.append("\\\\");
				break;
			case '\b':
				sb.append("\\b");
				break;
			case '\f':
				sb.append("\\f");
				break;
			case '\n':
				sb.append("\\n");
				break;
			case '\r':
				sb.append("\\r");
				break;
			case '\t':
				sb.append("\\t");
				break;
			//case '/':
			//	sb.append("\\/");
			//	break;
			default:
				if (isInitial) {
					if (ch >= '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);
				}
			}
		}
	}
	

 

© 著作权归作者所有

共有 人打赏支持
小徐同学
粉丝 44
博文 10
码字总数 4717
作品 0
珠海
程序员
加载中

评论(3)

小徐同学
小徐同学

引用来自“JFinal”的评论

这个方案还可以,只不过 jfinal 3.2 发布以后有更加彻底、完美的方案,从数据库来的数据直接就可以弄成驼峰的,而且不必在 Json 转换工具上费时间

并且,不管你是用哪 json 工具,完全没有关系 :grinning:
那就坐等啦!!!!:kissing_heart:
JFinal
JFinal
这个方案还可以,只不过 jfinal 3.2 发布以后有更加彻底、完美的方案,从数据库来的数据直接就可以弄成驼峰的,而且不必在 Json 转换工具上费时间

并且,不管你是用哪 json 工具,完全没有关系 :grinning:
小徐同学
小徐同学
@JFinal 麻烦波总指正下,如果这样可行 我分享到club
OSC上关于Jfinal的提问整理(一)

看见Jfinal很火,就手痒痒了,想学一下,无奈入门较慢,没有找到比较全的文档。于是就经常看讨论区大家的提问与解答。后来就忽然萌生了整理下来的想法。其中的问题如果是@Jfinal 回答的,那我...

木川瓦兹
2013/04/23
0
21
JFinal处理文件上传应该注意的问题

JFinal处理文件上传的时候,保存文件什么的都没有问题。需要注意的地方就是你保存好了文件,打算返回Json格式的数据的时候注意了: setAttr("xxx", xxx);setAttr("xxx", xxx);renderJson();或...

无聊的人们啊
2012/04/17
0
6
JFinal使用笔记5-使用AJAX方式访问JFinal

1、前台代码 2、后台代码 折腾了一晚上终于可以用ajax访问JFinal,并成功接收到返回值。 还是看了@JFinal对一个问题文章的回复才搞定的。 @JFinal 说渲染 json 数据更简单,下面给出三个例子...

土龙
2013/03/13
0
4
JFinal针对ORACLE的timestamp字段解决办法

JFinal是个比较不错的的框架,但JFinal起源时使用mysql数据库,因此在对数据库支持方面还没有达到完美。 本人使用JFinal有一段时间的,由于项目的数据库普遍采用oracle,在使用oracle过程中遇...

真的农夫三拳
2013/06/23
0
6
JFinal 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal
04/28
0
129

没有更多内容

加载失败,请刷新页面

加载更多

shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
20分钟前
0
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
55分钟前
1
0
linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
14
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部