标签:shm arraylist 没有 sim 重写 declared 友好 vcc types
java接口返json时,会有字段为空,客户端不希望有为null的字段。
{"$ref":"$.data.list[0].batchInfo"}
的值。"$ref":".." 上一级 "$ref":"@" 当前对象,也就是自引用 "$ref":"$" 根对象" $ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0)
public class AppLauncher extends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(AppLauncher.class);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters); // 不知道这句有什么用
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue, // 空map转{}
SerializerFeature.WriteNullNumberAsZero, // 空Integer转0
SerializerFeature.WriteNullStringAsEmpty, // 空String转""
SerializerFeature.WriteNullListAsEmpty // 空List转[]
);
// 处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastConverter.setFastJsonConfig(fastJsonConfig);
//处理字符串, 避免直接返回字符串的时候被添加了引号——不知道这句有什么用
StringHttpMessageConverter smc = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(smc);
}
}
public class ConvertUtil {
/**
* java对象转map
*/
public static Map<String, Object> javaBeanToMap(Object obj) {
if (obj == null) {
return MapUtils.emptyMap();
}
try {
// 通过intropestor分析出字节码对象的信息beaninfo
// 如果不想把父类的属性也列出来的话,那getBeanInfo的第二个参数填写父类的信息
// BeanInfo beanInfo = Introspector.getBeanInfo(user.getClass(), Object.class);
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
// 通过调用getPro....方法获取对象的属性描述器
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
// 网上找的代码中没有判空,点进源码中看了下注释,是可能为空的,所以此处做判空校验
// 实现类 SimpleBeanInfo 直接返的null,其他实现类返的数组
if (propertyDescriptors == null || propertyDescriptors.length <= 0) {
return MapUtils.emptyMap();
}
Map<String, Object> map = new HashMap<>(propertyDescriptors.length);
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
// 过滤掉class属性
if (key.compareToIgnoreCase("class") == 0) {
continue;
}
Method getter = property.getReadMethod();
Object value;
if (getter != null) {
value = getter.invoke(obj);
if (value == null) {
value = MapUtils.emptyMap();
}
} else {
value = MapUtils.emptyMap();
}
map.put(key, value);
}
return map;
} catch (Exception e) {
log.error("javaBeanToMap failed : {}", e.getMessage());
return MapUtils.emptyMap();
}
}
}
public class ConvertUtil {
public static Map<String, Object> javaBeanToMap(Object obj) {
// 这里map初始化还不能设置初始值,因为不知道设为几,不友好
Map<String, Object> map = new HashMap<>();
List<Method> methods = getAllMethods(obj);
for (Method m : methods) {
String methodName = m.getName();
if (methodName.startsWith("get")) {
try {
//获取属性名,首字母小写
String propertyName = methodName.substring(3);
propertyName = (new StringBuilder()).append(Character.toLowerCase(propertyName.charAt(0)))
.append(propertyName.substring(1)).toString();
if (Objects.isNull(m.invoke(obj))) {
map.put(propertyName, MapUtils.emptyMap());
} else {
map.put(propertyName, m.invoke(obj));
}
} catch (Exception e) {
log.error("javaBeanToMap failed : {}", e.getMessage());
return MapUtils.emptyMap();
}
}
}
return map;
}
/**
* 获取obj中的所有方法
*/
private static List<Method> getAllMethods(Object obj) {
List<Method> methods = new ArrayList<>();
Class<?> clazz = obj.getClass();
while (!clazz.getName().equals("java.lang.Object")) {
methods.addAll(Arrays.asList(clazz.getDeclaredMethods()));
clazz = clazz.getSuperclass();
}
return methods;
}
}
标签:shm arraylist 没有 sim 重写 declared 友好 vcc types
原文地址:https://www.cnblogs.com/code-to-world/p/11010369.html