[alibaba/fastjson]对象转json之后会出现反斜杠具体怎么处理?

2025-11-25 797 views
8

RespState states = new RespState(); states.setStatus(1); states.setMessage("11"); return JSON.toJSONString(states);

前端收到的就是这个形式的 "{\"message\":\"openid or award is empty\",\"status\":1}" 我翻了好多帖子都是利用字符串来去掉\ 我想知道fastjson里面在json转出的时候过滤掉 \

回答

1

没看明白你得代码,message在代码里是11,怎么变成openid .... 哪里有\

0

就是反斜杠 \ 格式化之后的json 出现了转义字符,这个转义字符如何能过滤掉

9

还是没明白,特殊符号按规范必须转义

0

@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}
2

我猜楼主说的是这个意思?

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"}
2

@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);
6

StringEscapeUtils.unescapeEcmaScript(paramData);用这个方发吧,可以去掉反斜杠

0

我猜楼主说的是这个意思?

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 有对应的属性可以设置过滤掉特殊字符的转义吗?

8

我猜楼主说的是这个意思? 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());
}

}

0

我猜楼主说的是这个意思?

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

8

这样貌似更好


@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());
    }
}

FROM: https://xinyo.org/archives/66512

8

可以考虑使用 JSON.toJSONString(obj, SerializerFeature.UseSingleQuotes);

5

我猜楼主说的是这个意思? 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

接口被废弃了,现在也不管用了