异常报错
Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token
at [Source: (PushbackInputStream); line: 1, column: 25] (through reference chain: com.pinyougou.pojo.TbTypeTemplate["customAttributeItems"])]
问题分析
需要配置使用FastJson插件返回json数据
在springboot项目里当我们在控制器类上加上@RestController注解或者其内的方法上加入@ResponseBody注解后,默认会使用jackson插件来返回json数据,下面我们利用fastjson为我们提供的FastJsonHttpMessageConverter来返回json数据。
- springboot1.X 版本中可以生效
/**
* @author LoganXie
* @description
* @create_date 2020/4/11
*/
@Configuration
public class FastJsonMessageConverterConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect, // 防止循环引用
SerializerFeature.WriteNullListAsEmpty, // 空集合返回[],不返回null
SerializerFeature.WriteNullStringAsEmpty, // 空字符串返回"",不返回null
SerializerFeature.WriteNullBooleanAsFalse, //Boolean字段如果为null,输出为false,而非null
SerializerFeature.WriteMapNullValue //是否输出值为null的字段,默认为false
);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
converters.add(fastJsonHttpMessageConverter);
}
}
- springboot2.X 版本配置
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters() {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.DisableCircularReferenceDetect, // 防止循环引用
SerializerFeature.WriteNullListAsEmpty, // 空集合返回[],不返回null
SerializerFeature.WriteNullStringAsEmpty, // 空字符串返回"",不返回null
// SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null,输出为0,而非null
// SerializerFeature.PrettyFormat, // 格式化输出
// SerializerFeature.BeanToArray, // 将对象转为array输出
// SerializerFeature.QuoteFieldNames, // 输出key时是否使用双引号,默认为true
// SerializerFeature.UseSingleQuotes, // 输出key时使用单引号而不是双引号,默认为false(经测试,这里的key是指所有的输出结果,而非key/value的key,而是key,和value都使用单引号或双引号输出)
// SerializerFeature.WriteNullBooleanAsFalse, //Boolean字段如果为null,输出为false,而非null
SerializerFeature.WriteDateUseDateFormat, //全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
SerializerFeature.WriteMapNullValue //是否输出值为null的字段,默认为false
);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
return new HttpMessageConverters(fastJsonHttpMessageConverter);
}