RespState states = new RespState(); states.setStatus(1); states.setMessage("11"); return JSON.toJSONString(states);
前端收到的就是这个形式的 "{\"message\":\"openid or award is empty\",\"status\":1}" 我翻了好多帖子都是利用字符串来去掉\ 我想知道fastjson里面在json转出的时候过滤掉 \
RespState states = new RespState(); states.setStatus(1); states.setMessage("11"); return JSON.toJSONString(states);
前端收到的就是这个形式的 "{\"message\":\"openid or award is empty\",\"status\":1}" 我翻了好多帖子都是利用字符串来去掉\ 我想知道fastjson里面在json转出的时候过滤掉 \
没看明白你得代码,message在代码里是11,怎么变成openid .... 哪里有\
就是反斜杠 \ 格式化之后的json 出现了转义字符,这个转义字符如何能过滤掉
还是没明白,特殊符号按规范必须转义
@VesperHan 你说的是在Eclipse或其它IDE的里面,字符串:
"{"message":"openid or award is empty","status":1}"
是这样显示的:
String msg = "{\"message\":\"openid or award is empty\",\"status\":1}";
如果问题是这样的,这个是不需要处理,因为"\"并不是字符内容的一部分,你可以运行一下下面的代码:
System.out.println(msg);
// print out: {"message":"openid or award is empty","status":1}
我猜楼主说的是这个意思?
Controller:
@RestController
public class testController {
public String getStudent() {
// get student obj from db
return JSONUtils.obj2String(student);
}
}
同时,加入了WebMvcConfigurer
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
converters.add(converter);
}
}
返回的时候,前端显示的数据就变成了
"{\"gender\":0,\"id\":3,\"password\":\"1234\",\"student_name\":\"penny\"}"
但是,希望返回的数据应该是
{"gender":0,"id":3,"password":"1234","student_name":"penny"}
@wenshao 如果map中的value值本身是json字符串,还可以去除转义字符吗?
JSONObject result = new JSONObject();
result.put("resultCode", "0");
Map<String, String> map = new HashMap<>(); // 祖传代码中贯穿前后的map。。。
map.put("xxx", "1");
JSONObject person = new JSONObject();
person.put("name", "zhangsan");
person.put("age", "20");
map.put("person", person.toJSONString());
result.put("params", map);
System.out.println(result);
// {"resultCode":"0","params":{"person":"{\"name\":\"zhangsan\",\"age\":\"20\"}","xxx":"1"}}
自问自答:把所有的Map<String,String> 改为 Map<String,Object>,然后直接put JSONObject map.put("person", person);
StringEscapeUtils.unescapeEcmaScript(paramData);用这个方发吧,可以去掉反斜杠
我猜楼主说的是这个意思?
Controller:
@RestController public class testController { public String getStudent() { // get student obj from db return JSONUtils.obj2String(student); } }同时,加入了WebMvcConfigurer
@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converters.add(converter); } }返回的时候,前端显示的数据就变成了
"{\"gender\":0,\"id\":3,\"password\":\"1234\",\"student_name\":\"penny\"}"但是,希望返回的数据应该是
{"gender":0,"id":3,"password":"1234","student_name":"penny"}
YES,你说的是对的,所以如何解决?FastJsonHttpMessageConverter 有对应的属性可以设置过滤掉特殊字符的转义吗?
我猜楼主说的是这个意思? Controller:
@RestController public class testController { public String getStudent() { // get student obj from db return JSONUtils.obj2String(student); } }同时,加入了WebMvcConfigurer
@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converters.add(converter); } }返回的时候,前端显示的数据就变成了
"{\"gender\":0,\"id\":3,\"password\":\"1234\",\"student_name\":\"penny\"}"但是,希望返回的数据应该是
{"gender":0,"id":3,"password":"1234","student_name":"penny"}YES,你说的是对的,所以如何解决?FastJsonHttpMessageConverter 有对应的属性可以设置过滤掉特殊字符的转义吗?
好吧,我这边目前验证后,可行的更改方式如下: 在对应的FastJson的Config配置类中,重写对应的extendMessageConverters()方法,如下:
@Configuration
public class FactJsonConfig implements WebMvcConfigurer {
@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
converter.setFastJsonConfig(fastJsonConfig);
return converter;
}
/**
此处实现WebMvcConfigurer接口,重写extendMessageConverters方法,
使其StringHttpMessageConverter在fastJsonHttpMessageConverter之前进行执行,
可以有效避免String字符的重复序列化导致的斜杠问题
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
/*
需注意,converters中默认还包含很多的HttpMessageConverter,如:ByteArrayHttpMessageConverter等很多 <br/>
此处使用converters.clear();将会导致所有的转换器全部清空,尽管在下面代码中有重新添加两个转换器,<br/>
但如果你的程序中需要使用到其它转换器,请记得在此处重新add一下; kbase-psrt
*/
converters.clear();
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(converter);
converters.add(fastJsonHttpMessageConverter());
}
}
我猜楼主说的是这个意思?
Controller:
@RestController public class testController { public String getStudent() { // get student obj from db return JSONUtils.obj2String(student); } }同时,加入了WebMvcConfigurer
@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converters.add(converter); } }返回的时候,前端显示的数据就变成了
"{\"gender\":0,\"id\":3,\"password\":\"1234\",\"student_name\":\"penny\"}"但是,希望返回的数据应该是
{"gender":0,"id":3,"password":"1234","student_name":"penny"}
======================================================== 这个问题我也纠结了很久,现在解决了。 客户端调用服务端http 接口,如果返回内容为json 文本而且带有转义字符,这种情况下推测服务端序列化工具有可能使用fastjson 的 json.tojsonstring 方法,默认添加转义符号,这种情况下客户端收到响应也会如实打印转义符,但是这种情况显然不适合给人看,这时候我们依然可以使用 fastjson 再次反序列化响应 response body ,方法为 JSON.toJSONString(resp, SerializerFeature.DisableCheckSpecialChar);
然后我们就可以看到熟悉的 json 格式文本。
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
这样貌似更好
@Configuration
public class Mvc2JsonConfig implements WebMvcConfigurer {
/**
* FastJsonHttpMessageConverter 在 HttpMessageConverter 列表中的位置
* 若 FastJsonHttpMessageConverter 在 StringHttpMessageConverter 前被调用,会导致对string进行二次转换
* 由于 StringHttpMessageConverter 在第1和2的位置上,要排在其后,并且排在jacksonConverter之前,故位置为3
*/
private static final int FAST_JSON_CONVERTER_INDEX = 3;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
List<MediaType> supportMediaTypeList = new ArrayList<>();
supportMediaTypeList.add(MediaType.TEXT_HTML);
supportMediaTypeList.add(MediaType.APPLICATION_JSON);
supportMediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
supportMediaTypeList.add(MediaType.valueOf("application/*+json"));
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
converter.setFastJsonConfig(fastJsonConfig);
converter.setSupportedMediaTypes(supportMediaTypeList);
return converter;
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
messageConverters.add(FAST_JSON_CONVERTER_INDEX, fastJsonHttpMessageConverter());
}
}
可以考虑使用 JSON.toJSONString(obj, SerializerFeature.UseSingleQuotes);
看这个是不是你需要的: https://github.com/alibaba/fastjson/wiki/JSONField_jsonDirect_cn
谢谢,亲测有效
我猜楼主说的是这个意思? Controller:
@RestController public class testController { public String getStudent() { // get student obj from db return JSONUtils.obj2String(student); } }同时,加入了WebMvcConfigurer
@Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); converters.add(converter); } }返回的时候,前端显示的数据就变成了
"{\"gender\":0,\"id\":3,\"password\":\"1234\",\"student_name\":\"penny\"}"但是,希望返回的数据应该是
{"gender":0,"id":3,"password":"1234","student_name":"penny"}======================================================== 这个问题我也纠结了很久,现在解决了。 客户端调用服务端http 接口,如果返回内容为json 文本而且带有转义字符,这种情况下推测服务端序列化工具有可能使用fastjson 的 json.tojsonstring 方法,默认添加转义符号,这种情况下客户端收到响应也会如实打印转义符,但是这种情况显然不适合给人看,这时候我们依然可以使用 fastjson 再次反序列化响应 response body ,方法为 JSON.toJSONString(resp, SerializerFeature.DisableCheckSpecialChar);
然后我们就可以看到熟悉的 json 格式文本。
DisableCheckSpecialChar 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false [参考来源]https://kbzsoft.com/archives/1557456478667
接口被废弃了,现在也不管用了