日期:2014-05-17  浏览次数:20660 次

【求大神】struts2返回json的格式问题
问题是这样的,做项目的过程中发现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,直接就对象到页面就行了。