/* { "fieldErrors": {"password":["密码长度为3-20字符"]}} */
上面就是校验出错时JSONValidationInterceptor返回给我的结果,竟然被/* {} */包围。
这样产生的问题是:使用JQuery这样的ajax框架时,如果设置了返回数据类型dataType=json, jQuery会自动解析返回的字符串成为json对象,倒霉的是,非良构的json字串会被jQuery忽略掉,从而导致回调方法永远不会被执行。
查看源码发现问题在buildResponse方法中:
protected String buildResponse(ValidationAware validationAware) {
//should we use FreeMarker here?
StringBuilder sb = new StringBuilder();
sb.append("/* { ");
if (validationAware.hasErrors()) {
//action errors
if (validationAware.hasActionErrors()) {
sb.append("\"errors\":");
sb.append(buildArray(validationAware.getActionErrors()));
}
//field errors
if (validationAware.hasFieldErrors()) {
if (validationAware.hasActionErrors())
sb.append(",");
sb.append("\"fieldErrors\": {");
Map<String, List<String>> fieldErrors = validationAware
.getFieldErrors();
for (Map.Entry<String, List<String>> fieldError : fieldErrors
.entrySet()) {
sb.append("\"");
//if it is model driven, remove "model." see WW-2721
sb.append(validationAware instanceof ModelDriven ? fieldError.getKey().substring(6)
: fieldError.getKey());
sb.append("\":");
sb.append(buildArray(fieldError.getValue()));
sb.append(",");
}
//remove trailing comma, IE creates an empty object, duh
sb.deleteCharAt(sb.length() - 1);
sb.append("}");
}
}
sb.append("} */");
/*response should be something like:
* {
* "errors": ["this", "that"],
* "fieldErrors": {
* field1: "this",
* field2: "that"
* }
* }
*/
return sb.toString();
}
请看
sb.append("/* { ");
和
sb.append("} */");
这确实是个bug,倒不是开发人员故意而为之,在struts2.2.2会被fix掉。
http://struts.1045723.n5.nabble.com/jira-Created-WW-3545-JSONValidationInterceptor-Returns-Invalid-quot-true-quot-json-Do-not-put-javascn-td3550970.html
如果你只能用2.2.2以前的版本,那就重新自定义这个interceptor,把上面的代码改为
sb.append(" { ");
和
sb.append(" } ");
即可。
分享到:
相关推荐
2. **加载JSON字符串**:获取到JSON数据后,第一步通常是将其转换为一个可操作的对象。在Python中,这可以通过`json.loads()`函数实现,将JSON字符串转化为Python字典或列表。在Java和JavaScript中,对应的函数分别...
读取一个文件中的多个json数据,可能还存在一些bug.为什么要超过50个字!看不起我的概括能力吗?
在早期的1.9.x版本中,这些模块被整合在一个`jackson-all`的JAR包里。随着版本的更新,Jackson库逐渐将各个模块分开,以便更好地管理和优化。 2. **使用Jackson处理JSON**: - **序列化**:将Java对象转换为JSON...
总的来说,Json.NET是一个强大且易用的工具,它使得.NET开发人员在处理JSON数据时能够更加高效和便捷,无论是从JSON到.NET对象,还是从.NET对象到JSON,Json.NET都提供了丰富的功能和高度的灵活性。对于任何涉及JSON...
一些好玩的注释~ “佛祖保佑 永无bug” 神兽 美女注释等
JSONEditor9.1.4是该工具的一个特定版本,可能包含了性能优化、新功能或bug修复。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在Web开发中,...
本文将深入探讨如何实现一个基于JSON解析的在线版本更新系统,并结合提供的代码资源进行详细讲解。 首先,让我们理解一下标题和描述中的核心知识点: 1. **在线版本更新**:这是指应用程序能够检查服务器上是否...
在使用JSON-handle时,用户可以直接在浏览器中打开包含JSON数据的网页,插件会自动检测并提供一个直观的界面来展示JSON数据。这包括但不限于将嵌套的JSON对象和数组以树状结构显示,便于理解和浏览。用户可以通过...
在开发过程中,查看和处理JSON数据时,有一个好的工具能够极大地提高效率。谷歌浏览器中的Json-Handle插件就是这样一款实用工具,它专门设计用来方便开发者在浏览器中解析、编辑和格式化JSON数据。 Json-Handle插件...
8. **便捷操作**:只需在浏览器中打开一个包含Json数据的网页,JsonView就会自动识别并呈现数据,无需额外安装软件或进行复杂配置。 在使用JsonView时,有几点需要注意: 1. **安全考虑**:由于JsonView可以直接...
JSON Viewer是一款用于格式化查看JSON数据的工具,它使得复杂的JSON结构变得更加清晰易读,尤其在处理大量或深度嵌套的数据时,这类工具显得尤为重要。JSON(JavaScript Object Notation)是一种轻量级的数据交换...
`tree11.json`文件就是这样的数据源,包含一系列的对象,每个对象代表树的一个节点,通常包含`id`(唯一标识符)、`text`(节点文本)和`children`(子节点数组)等属性。例如: ```json [ { "id": "1", "text":...
描述中提到的“修复上一版的一个BUG”,意味着这个版本是对之前版本的改进,修复了已知的问题,可能是在数据处理、性能优化或用户交互方面存在不足,开发者进行了相应的调试和修复,使得新版本更稳定、更可靠。...
**Python-jsn:简化JSON数据操作...总结,jsn是Python开发者处理JSON数据时的一个强大工具,它利用命令行的强大功能,使得JSON操作变得简单、快捷。无论是在日常开发还是自动化脚本中,jsn都能提供高效的数据处理能力。
JSON-C是C语言实现的一个JSON库,它提供了一系列API,使得开发者能够方便地在C程序中处理JSON数据。这个压缩包“json-c0.13.1Release.rar”包含的是json-c库的0.13.1版本,专为Visual Studio 2012(VS 2012)编译...
4. **JSONTokener**:用于解析JSON文本,通过`next()`方法逐个读取字符,`back()`返回前一个字符,`hasMoreCharacters()`检查是否还有更多字符,`nextValue()`解析下一个JSON值。 关于提供的三个版本: - **json-...
9. **支持JSON Schema**:JSONedit还可能支持JSON Schema,这是一个JSON格式的规范,用于定义JSON数据的结构和限制,帮助验证JSON数据的正确性。 10. **跨平台**:作为exe文件,JSONedit可能适用于Windows操作系统...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,设计简单且易于人阅读和编写,同时也易于机器解析和生成。JSON格式被广泛应用于Web服务和应用程序之间的数据交换,...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web服务和应用程序之间的数据传输。它基于JavaScript语法,但比XML更加简洁、易读。网页版JSON格式化工具是专门用来处理和查看JSON数据的...
JSON-C是一个C语言实现的JSON库,专为那些需要在C环境中处理JSON数据的应用程序设计。`json-c-0.12.1.tar.gz`是这个库的一个特定版本,0.12.1,以.tar.gz压缩格式提供,这是在Linux和类Unix系统中常见的源码包打包...