问题是这样的,做项目的过程中发现struts2返回的json字符串有转义符和两端的双引号,造成接收端解析出错。代码如下:
public class GetStaffInfoAction extends ActionSupport{
@Autowired
private StaffService staffServiceImpl;
private String username;
public void setUsername(String usernmae) {
this.username = username;
}
private String result;
public String getResult() {
return result;
}
@Override
public String execute(){
Staff staff=staffServiceImpl.getStaffInfo(username);
result=JSONObject.fromObject(staff).toString();
return "str_result";
}
}
这种情况下页面得到结果是:"{\"checked\":false,\"text\":\"root\",\"id":0}"
有转义符,两端有双引号,转换会出错。改成下面这样,
public class GetStaffInfoAction extends ActionSupport{
@Autowired
private StaffService staffServiceImpl;
private String username;
public void setUsername(String username) {
this.username = username;
}
private JSONObject json;
public JSONObject getJson() {
return json;
}
@Override
public String execute(){
Staff staff=staffServiceImpl.getStaffInfo(username);
json=JSONObject.fromObject(staff);
return "json_result";
}
}
<global-results>
<result name="str_result" type="json">
<param name="root">result</param>
</result>
<result name="is_success" type="json">
<param name="root">success</param>
</result>
<result name="json_result" type="json">
<param name="root">json</param>
</result>
<result type="exception">/error.jsp</result>
</global-results>
直接把对象返回,这是页面得到的是{"checked":false,"text":"root","id":0}
这种结果没有错误,可以直接使用。
问题是解决了,可是我不明白是为什么,查资料有人是这样写的:
【在action中搞了json序列化,而struts2的json结果类型又搞了一次json序列化,所以就出现了你说的情况。正确的做法是在action中的result不要使用String类型,而是用Object类型,你想返回什么就直接赋值,然后struts2做他该做的那次序列化就ok了。】
是不是说<result name="json_result" type="json">的配置在返回数据之前会对数据做一次序列化,所以action里不再需要toString()了?
------解决方案--------------------
肯定不能用string来返回啦,string类型就是把结果加上"",你的正确结果是{"checked":false,"text":"root","id":0}它要加上"",当然这个字符串里面""很多,所以在处理的时候它自己把结果转换为带转椅字符的字符串:
"{\"checked\":false,\"text\":\"root\",\"id":0}"
------解决方案--------------------
你要是用ajax,就转成json,到页面取到就能用了,
你这也没用ajax,直接就对象到页面就行了。