我在action中写了下面的一个方法
[code="java"]
public String getDepartmentList() {
try {
List list = userService.getDepartments();
StringBuilder sb = new StringBuilder();
sb.append("{").append(" \"total \" : ").append(list.size()).append(",").append(" \" row \" :[");
for(Departmenet department : list){
sb.append("{ \" department_name \" :").append(" \" ").append(department.getDepartmentName()).append(" \" ,")
.append(" \" id \" :").append(" \" ").append(department.getId()).append(" \" },");
}
sb.deleteCharAt(sb.length()-1);
sb.append("]}");
result = sb.toString();
System.out.println(result);
return this.SUCCESS;
} catch (Exception e) {
e.printStackTrace();
addActionError(e.getMessage());
}
return this.INPUT;
}
[/code]
在运行时 tomcat打印出来的日志是正确的:
[code="java"]{"total":2,"row":[{"department_name ":"开发部","id":"1"},{"department_name ":"销售","id":"2"}]}[/code]
而我用浏览器直接访问url的时候显示的是:
[code="java"]"{ \"total \" : 2, \" row \" :[{ \" department_name \" : \" 开发部 \" , \" id \" : \" 1 \" },{ \" department_name \" : \" 销售 \" , \" id \" : \" 2 \" }]}"[/code]
请问下着是什么原因造成了 为什么转义符被打印出来了
[code="java"]
org.codehaus.jackson.map.ObjectMapper mapper = new org.codehaus.jackson.map.ObjectMapper();
Map map = new HashMap();
map.put("total", 2);
map.put("rows", deptList);
mapper.writeValue(response.getWriter(), map);
[/code]
你想的太复杂了,那儿不需要转义字符!直接写就可以了!!
你是说前台获得到的字符串吗?要是那样的话,在Action中直接写成你所需要的格式,你试试
这是因为,你用StringBuilder 建立对象,然后append进去的带 '\"',所以StringBuilder对象中带有'\"',没有解析的。
1.当输出日志或者通过console输出时,要通过解析,'\"'自然被解析为'"'
2.档在浏览器中访问时,经过浏览器时,本来就会有'"'和'\"'之间的互相转换,象这样的:"\""在往浏览器传的时候就会生成\"\\"\",然后经过浏览器解析变成了"\"",
3.建议:再java中生成json于javascript不一样,javascript中如果想得到json,需这样:"[{\"word\":\""+word+"\"}]",假如word="myself"
javascript结果:[{"word":"myselft"}]
java中结果:[{"word":"[color=darkred]"myself"[/color]"}]
这些跟编译器原理有关。
用单引号,
struts2 中是这个问题,其实在.net中也是这样的,具体struts1怎么样,我不是十分清楚。总之这跟语言编译器解释时转换有关系,struts2于struts1本质上区别太大,具体什么原因很难说清楚,我的意思是你能搞定就ok啦,这个问题究竟如何有那么重要吗。
其实我也有这种感觉,拦截器里面谁也不知道发生什么操作了,但问题是我在.net中也是由这种问题
建议使用Jackson,Jackson提供了最好的性能,转换Java对象可以是List,POJO[],POJO,也可以Map名值对。
建议可以不用StringBuilder,直接定义一个String字符串,然后直接用+号操作,这样就会出现正确结果