1.需求:后台使用java编码,传递到前台使用js接收解码
解决:
1)后台:json字符串形式传递
①简单的java对象转化成jsonObject,再toString()
JSONObject rtObject = new JSONObject();
rtObject.put("flag",URLEncoder.encode((String)rs.get("error_code"), Config.ENCODING));
rtObject.put("errorMessage",URLEncoder.encode((String)rs.get("error_msg"), Config.ENCODING));
return rtObject.toString();
②有很多属性的对象,整体当做jsonObject传递,通过一个方法convertUrlEncodeString先转化成属性值编码后的对象,然后通过bean2JSon方法将java对象转化成jsonObject字符串
/**
* bean复制String类型的属性,将字符转化成url编码格式(UTF-8),用于网络传输
* @param oriBean
* @param bean
* @return
* @throws IllegalAccessException
* @throws IllegalArgumentException
* @throws UnsupportedEncodingException
*/
private OcrResultBean convertUrlEncodeString(OcrResultBean oriBean) throws IllegalArgumentException, IllegalAccessException, UnsupportedEncodingException{
OcrResultBean bean = new OcrResultBean ();
Field[] field = oriBean.getClass().getDeclaredFields();
for(int i=0 ; i<field.length ; i++){ //遍历所有属性
Field f = field[i];
f.setAccessible(true); //设置些属性是可以访问的
Object val = f.get(oriBean);//得到oriBean此属性的值
String type = f.getType().toString();//得到此属性的类型
if (type.endsWith("String")) {
f.set(bean,URLEncoder.encode((String)val,"UTF-8")) ; //给bean此属性设值,utf-8编码
}
/*else if(type.endsWith("int") || type.endsWith("Integer")){
f.set(bean,12) ; //给属性设值
}else{
//System.out.println(f.getType()+"\t");
}*/
}
return bean;
}
public String bean2JSon(Object bean){
try {
return mapper.writeValueAsString(bean);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
2)前台js接收解码
//$("#result").html(decodeURI(JSON.stringify(data))); //不要使用此方法,会出现乱码,如8172323%40qq.com (%40应该是@)
$("#result").html(decodeURIComponent(JSON.stringify(data))); //此方法不会出现乱码