JSON转换报错

写代码的时候去数据库查询,返回的数据是map里嵌套list的格式,需要转换成JSON格式返回到页面上,然后遇到一个比较奇怪的报错:
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
这个报错本身很简单,就是JSON转换错误,但是我按照代码里返回值的结构自己写了测试类进行转换却没有报错

测试类如下:

public class ListToJSON {
	public static void main(String[] args) {
		Map a = new HashMap();
		a.put("name", "xiaoming");
		a.put("sex", "male");
		a.put("grade", "3");
		Map b = new HashMap();
		b.put("name", "xiaohua");
		b.put("sex", "female");
		b.put("grade", "3");
		List list = new ArrayList();
		list.add(a);
		list.add(b);
		Map c = new HashMap();
		c.put("identity", "student");
		c.put("infomation", list);
		System.out.println(c);
		//JSONObject result = (JSONObject)JSON.toJSON(c);
		JSONObject result=JSONObject.fromObject(c);
		System.out.println(result.toString());
	}
}
后来百度了一下,才明白原因,我查数据库的返回值里有date类型的数据,java.sql.date会转换成java.util.date,这种转换为JSON就会报错
select a.result_comparison as resultComparison,
       		   a.apply_date        as applyDate,//此处为日期格式,返回转JSON就会报错
       		   a.interviewee_name  as intervieweeName
  		  from visit_appointment_info a
 		 where a.visit_cardno = #visitCardNo#
   		   and a.visit_name = #visitName#
   		   and a.apply_date >= current_date;

解决方式:在mybatis中将日期先改为字符串再返回,就可以了

select a.result_comparison as resultComparison,
       		   to_char(a.apply_date, 'yyyy-mm-dd')        as applyDate,
       		   a.interviewee_name  as intervieweeName
  		  from visit_appointment_info a
 		 where a.visit_cardno = #visitCardNo#
   		   and a.visit_name = #visitName#
   		   and a.apply_date >= current_date;





在使用 JMeter 进行参数化测试时,如果后端 Java 服务在处理 JSON 请求体时进行了 XSS(跨站脚本攻击)过滤,可能会导致请求中的某些特殊字符被拦截或义,从而引发 JSON 转换错误。这类问题通常表现为 `InvalidFormatException`、`JsonParseException` 或类似的异常信息。 ### 参数化数据与XSS冲突的原因 XSS过滤机制通常会移除或拒绝包含潜在危险字符的内容,例如: - `<script>` - `onerror=` - `javascript:` 等脚本相关的关键词 - 特殊 HTML 标签或属性 当这些内容出现在参数化文件中,并作为 JSON 字段值发送给后端时,即使它们是合法的业务数据(如用户输入的昵称、评论等),也可能被安全框架误判为攻击行为并阻止解析。 ### 解决方案与配置建议 #### 1. 在JMeter中预处理参数值 可以使用 **BeanShell PreProcessor** 或 **JSR223 PreProcessor** 对参数值进行编码处理,避免直接传递可能触发XSS过滤的原始字符串。 例如,在 JSR223 PreProcessor 中使用 Groovy 对变量进行 HTML 实体编码: ```groovy import org.apache.commons.text.StringEscapeUtils; def rawValue = vars.get("inputParam"); def encodedValue = StringEscapeUtils.escapeHtml4(rawValue); vars.put("encodedInputParam", encodedValue); ``` 然后在 HTTP 请求体中使用 `${encodedInputParam}` 替代原始变量名。 #### 2. 使用URL编码代替HTML编码(适用于GET请求) 对于 GET 请求或 URL 参数,应使用 URL 编码方式处理敏感字符: ```groovy def rawValue = vars.get("inputParam"); def encodedValue = URLEncoder.encode(rawValue, "UTF-8"); vars.put("urlEncodedInputParam", encodedValue); ``` #### 3. 修改后端XSS过滤规则(推荐) 如果条件允许,最根本的解决办法是在后端调整 XSS 过滤逻辑。例如: - 对于仅用于展示的数据字段启用过滤 - 对接收 JSON 的接口放宽 XSS 检查级别 - 使用白名单机制而非黑名单机制来识别恶意内容 #### 4. 使用自定义函数或插件进行编码 JMeter 支持通过插件扩展其功能,例如使用 `__escapeHtml` 函数对变量进行 HTML 义: ``` ${__escapeHtml(${inputParam})} ``` 这种方式无需编写脚本,适合快速部署和维护。 #### 5. 验证JSON格式正确性 确保参数化数据不会破坏 JSON 结构,尤其是在字段值中包含双引号 `"`、反斜杠 `\` 等字符时,应提前进行义处理。可以使用在线 JSON 校验工具或 JMeter 的响应断言功能验证请求体是否符合标准 JSON 格式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值