JFinal renderJson对下划线支持不够友好问题
JFinal renderJson对下划线支持不够友好问题
小徐同学 发表于5个月前
JFinal renderJson对下划线支持不够友好问题
  • 发表于 5个月前
  • 阅读 35
  • 收藏 0
  • 点赞 0
  • 评论 3

腾讯云 新注册用户 域名抢购1元起>>>   

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);
				}
			}
		}
	}
	

 

标签: JFinal
共有 人打赏支持
粉丝 37
博文 8
码字总数 3851
评论 (3)
小徐同学
@JFinal 麻烦波总指正下,如果这样可行 我分享到club
JFinal
这个方案还可以,只不过 jfinal 3.2 发布以后有更加彻底、完美的方案,从数据库来的数据直接就可以弄成驼峰的,而且不必在 Json 转换工具上费时间

并且,不管你是用哪 json 工具,完全没有关系 :grinning:
小徐同学

引用来自“JFinal”的评论

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

并且,不管你是用哪 json 工具,完全没有关系 :grinning:
那就坐等啦!!!!:kissing_heart:
×
小徐同学
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: