在使用fastjson作为json格式化工具时,

如果controller使用的是@RestController注解,并配置了fastjson消息转换器。

@Configuration
public class FeignMessageConverterConfig {

    @Bean
    public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        //1.需要定义一个convert转换消息的对象;
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        //2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.WriteNullNumberAsZero,
                SerializerFeature.QuoteFieldNames,
                SerializerFeature.WriteNullStringAsEmpty,
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteDateUseDateFormat);
        //关闭转义字符
        fastJsonConfig.setFeatures(Feature.DisableSpecialKeyDetect);
        //3处理中文乱码问题
        List<MediaType> fastMediaTypes = new ArrayList<>();
        fastMediaTypes.add(MediaType.APPLICATION_JSON);
        //4.在convert中添加配置信息.
        fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
        fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
        return fastJsonHttpMessageConverter;
    }
}
@Slf4j
@RestController
public class DYDataFormController {

/**
     * 地区编码查询(省)
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "/dy/queryProvince")
    public String queryProvince(HttpServletRequest request) {
        log.info("queryProvince。start...");
        RSP rsp = new RSP();
        try {
            String resultStr = (String) dataFormFeignApi.queryArea("1",null,null);
            RSP result = JSONObject.parseObject(JSON.parse(resultStr).toString(),RSP.class);
            return result;
        } catch (ErrorException e) {
            log.error("queryProvince失败:[{}]->[{}]", e.getCode(), e.getMsg());
            rsp.rsp(e.getCode(), e.getMsg());
            return rsp;
        } catch (Exception e) {
            log.error("queryProvince失败:[{}]", e.getMessage());
            rsp.fail(e.getMessage());
            return rsp;
        }
    }
}

如果返回的是String类型, fastjson会进行序列化转义。

正常的json格式变成了如下,多了\转义符

{\"HEAD\":{\"MSG\":\"操作成功\",\"CODE\":\"000\"},\"BODY\":[{}]}

两种处理方式

第一种,修改返回类型,由String改为Object

String resultStr = (String) dataFormFeignApi.queryArea("1",null,null);
//JSON.parse(resultStr)会解析转义字符
RSP result = JSONObject.parseObject(JSON.parse(resultStr).toString(),RSP.class);

第二种,在接收端进行序列化处理

/**
     * 地区编码查询(省)
     *  返回值改为Object,就不会进行转义了
     * @param request
     * @return
     */
    @RequestMapping(value = "/dy/queryProvince")
    public Object queryProvince(HttpServletRequest request) {
        log.info("queryProvince。start...");
        RSP rsp = new RSP();
        try {
            String resultStr = (String) dataFormFeignApi.queryArea("1",null,null);
            RSP result = JSONObject.parseObject(JSON.parse(resultStr).toString(),RSP.class);
            return result;
        } catch (ErrorException e) {
            log.error("queryProvince失败:[{}]->[{}]", e.getCode(), e.getMsg());
            rsp.rsp(e.getCode(), e.getMsg());
            return rsp;
        } catch (Exception e) {
            log.error("queryProvince失败:[{}]", e.getMessage());
            rsp.fail(e.getMessage());
            return rsp;
        }
    }

文章作者: 刘同学
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 刘同学的小站
后端 Java
喜欢就支持一下吧