文档章节

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

小徐同学
 小徐同学
发布于 2017/07/24 15:45
字数 439
阅读 49
收藏 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);
				}
			}
		}
	}
	

 

© 著作权归作者所有

共有 人打赏支持
小徐同学
粉丝 45
博文 11
码字总数 5432
作品 0
广州
程序员
私信 提问
加载中

评论(3)

小徐同学
小徐同学

引用来自“JFinal”的评论

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

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

并且,不管你是用哪 json 工具,完全没有关系 😀
小徐同学
小徐同学
@JFinal 麻烦波总指正下,如果这样可行 我分享到club
swfupload和jfinal集成

@JFinal 你好,想跟你请教个问题: swfupload和jfinal集成的时候,应该返回render啥?如果是renderJson的话,需要塞什么特殊字符串么?我试了renderJson,但是还是没有成功处理后的返回...

莫莫水心
2013/03/17
372
5
JFinal 1.5 发布,JAVA极速WEB+ORM框架

JFinal 爱好者一直都在问 JFinal 何时再次升级?JFinal 1.5 何时发布?以往升级都保持在每月近两次的频率,为何本次五个月过去了新版本还不出?由于作者暂时阔别码坛已有半年时间,一直无暇顾...

JFinal
2013/10/08
7.2K
101
jfinal用config类启动工程无法用fastjson转换,而jetty:run就可以

@JFinal 你好,想跟你请教个问题: 这个问题很怪, 我一直用maven的jetty:run来启动工程的, 今天想换成Config.java#main函数的这种启动方式 我的BaseController中有一段renderJson的方法: 方法...

错觉
2016/05/14
344
1
jFinal的renderJson使用gson的JsonObject或JsonArray对象会报错

@JFinal 你好,想跟你请教个问题: jFinal的renderJson使用gson的JsonObject或JsonArray对象会报错

weili0677
2013/07/17
2.5K
4
jfinal renderJson 日期格式

@JFinal 你好,想跟你请教个问题:jfinal renderJson 时如何指定 日期格式

Q317075064
2013/01/17
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

教你React Native使用fetch实现图片上传

这篇文章主要介绍了详解react关于事件绑定this的四种方式,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 在react组件中,每个方...

前端攻城老湿
2分钟前
0
0
webpack+vuex+axios 跨域请求数据的示例

本篇文章主要介绍了webpack+vuex+axios 跨域请求数据,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 使用vue-li 构建 webpack项...

前端攻城小牛
6分钟前
0
0
基础编程题目集-6-10 阶乘计算升级版

本题要求实现打印非负整数阶乘,其中N是用户传入的参数,其值不超过1000。如果N是非负整数,则该函数必须在一行中打印出N!的值,否则打印“Invalid input”。 输入格式: 每个输入包含一个测试...

niithub
6分钟前
0
0
聊聊flink的FsStateBackend

序 本文主要研究一下flink的FsStateBackend StateBackend flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/StateBackend.java @PublicEvolvingpublic interface Sta......

go4it
36分钟前
1
0
webpack配置proxyTable时pathRewrite无效的解决方法

webpack配置接口地址代理 在项目开发中,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们在本地启动服务器后,比如本地开发服务下是 http://localhost:8080 ...

前端小攻略
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部