jackson定义返回属性从下划线改成驼峰命令

本文解释了在SpringBoot应用中,如何配置Jackson处理JSON数据的序列化和反序列化,特别是关于驼峰命名法(CamelCase)和下划线命名法(SnakeCase)的转换。建议移除或调整`property-naming-strategy`配置以保持原始命名风格。

在Spring Boot应用中,Jackson的配置是用来控制如何序列化和反序列化JSON数据。从你提供的配置看,问题出现在property-naming-strategy的设置上。

jackson:
  property-naming-strategy: SNAKE_CASE

这个配置指示Jackson在序列化和反序列化时,将所有Java属性名从驼峰命名法(Camel Case)转换为下划线命名法(Snake Case)。因此,如果你有一个Java属性名为userName,在JSON中它会被表示为user_name

如果你希望属性名保持为驼峰命名法不变,你应该移除或更改property-naming-strategy的配置。移除这个配置项或将其设置为LOWER_CAMEL_CASE(这实际上是默认值,表示驼峰命名法)将保持属性名的驼峰式表示,例如:

jackson:
  property-naming-strategy: LOWER_CAMEL_CASE

或者,为了保持属性名的默认行为(即不改变属性名),你可以直接从你的配置文件中移除property-naming-strategy行:

jackson:
  serialization:
    WRITE_DATES_AS_TIMESTAMPS: false
    INDENT_OUTPUT: true
  deserialization:
    FAIL_ON_UNKNOWN_PROPERTIES: false
  default-property-inclusion: non_null

这样,Jackson在序列化和反序列化时将不会改变属性名的命名风格,保持你在Java中定义的驼峰命名法。确保在做出这些更改后重新启动你的应用,以便新的配置生效。

private Object createTestInstance(Class<?> clazz, Object outerInstance) throws Exception { Object obj; // 判断是否为非静态内部类 if (isNonStaticInnerClass(clazz)) { // 获取DeclaredConstructor,第一个参数是外部类实例 Constructor<?> constructor = clazz.getDeclaredConstructor(clazz.getDeclaringClass()); constructor.setAccessible(true); // 非静态内部类构造器可能不可见 obj = constructor.newInstance(outerInstance); } else { // 普通类或静态嵌套类:使用无参构造 Constructor<?> constructor = clazz.getDeclaredConstructor(); obj = constructor.newInstance(); } for (Field field : clazz.getDeclaredFields()) { field.setAccessible(true); Class<?> fieldType = field.getType(); Object value; // 处理 List<T> 且 T 是当前类的内部类 if (List.class.isAssignableFrom(fieldType) && field.getGenericType() instanceof ParameterizedType) { ParameterizedType paramType = (ParameterizedType) field.getGenericType(); Type genericArg = paramType.getActualTypeArguments()[0]; if (genericArg instanceof Class<?>) { Class<?> listElementType = (Class<?>) genericArg; // 检查是否是当前类声明的内部类 if (listElementType.getDeclaringClass() == clazz) { Object innerObj = createTestInstance(listElementType, obj); // 传入当前 obj 作为 outer value = new ArrayList<>(Collections.singletonList(innerObj)); } else { value = new ArrayList<>(); } } else { value = new ArrayList<>(); } } // 基本类型填充 else if (fieldType == String.class) { value = "test"; } else if (fieldType == int.class || fieldType == Integer.class) { value = 1; } else if (fieldType == long.class || fieldType == Long.class) { value = 1L; } else if (fieldType == double.class || fieldType == Double.class) { value = 1.0; } else if (fieldType == float.class || fieldType == Float.class) { value = 1.0f; } else if (fieldType == boolean.class || fieldType == Boolean.class) { value = true; } else if (fieldType == BigDecimal.class) { value = BigDecimal.ONE; // ✅ 正确:使用 BigDecimal 实例 } else if (fieldType.isEnum()) { Object[] constants = fieldType.getEnumConstants(); value = constants.length > 0 ? constants[0] : null; } else { // 其他复杂类型递归处理(防止循环引用) value = createTestInstanceForNonPrimitive(fieldType, obj); } field.set(obj, value); } return obj; } 这个方法会将我的字段名称变成小写开头,我不允许他修改我的字段名称
最新发布
12-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值