优化json格式 springboot

普通格式:

@RestController
@RequestMapping("/api")
public class PaymentHistoryController {

    @Autowired
    private paymentHistoryService paymentHistoryService;

    @PutMapping("/payment")
    public R processPaymentRequest(@RequestHeader("Authorization") String authorizationHeader,
                                   @RequestBody PaymentRequest paymentRequest) {
        try {
            String token = authorizationHeader.substring(7); // 去掉 "Bearer " 前缀
            CheckResult checkResult = JwtUtils.validateJWT(token);
            if (checkResult.isSuccess()) {
                Claims claims = checkResult.getClaims();
                int userId = Integer.parseInt(claims.getId());
                String username = claims.getSubject();
                paymentRequest.getPaymentHistory().setUid(userId);
                paymentRequest.getPaymentHistory().setUsername(username);
                paymentRequest.getPaymentHistory().setPaymentDate(LocalDateTime.now());

                paymentRequest.getLoaning().setUid(userId);

                boolean paymentInserted = paymentHistoryService.insertPaymentHistory(paymentRequest.getPaymentHistory());
                boolean debtUpdated = paymentHistoryService.updateDebtAmountByUid(userId,paymentRequest.getPaymentHistory().getPaymentAmount());
                if (paymentInserted && debtUpdated) {
                    System.out.println("用户名是:"+username);
                    return R.ok("还款成功");
                } else {
                    return R.error("还款失败");
                }
            } else {
                return R.error("Token验证失败");
            }
        } catch (Exception e) {
            System.out.println("剩余金额是:"+paymentRequest.getPaymentHistory().getPaymentAmount());
            return R.error("处理请求时发生错误:" + e.getMessage());
        }
    }
}

 json格式:

{
    "loaning": {
        "username": "力士山",
        "amount": 100.0
    },
    "paymentHistory": {
        "paymentAmount": 100.0
    }
}

 

优化:

现在请求体的JSON格式只包含了 "amount" 字段。在你的代码中,你需要从JWT中解析出用户名,并将这个用户名与传入的 "amount" 值一起使用来执行操作。

在代码中,使用了 claims.getSubject() 来获取用户名,这通常是一个不错的选择,但是请确保在创建JWT令牌时也将用户名放入了 sub (subject) 声明中

@RestController
@RequestMapping("/api")
public class PaymentHistoryController {

    @Autowired
    private paymentHistoryService paymentHistoryService;

    @PutMapping("/payment")
    public R processPaymentRequest(@RequestHeader("Authorization") String authorizationHeader,
                                   @RequestBody Map<String, Double> requestBody) {
        try {
            String token = authorizationHeader.substring(7); // 去掉 "Bearer " 前缀
            CheckResult checkResult = JwtUtils.validateJWT(token);
            if (checkResult.isSuccess()) {
                Claims claims = checkResult.getClaims();
                int userId = Integer.parseInt(claims.getId());
                String username = claims.getSubject(); // 获取用户名

                PaymentHistory paymentHistory = new PaymentHistory();
                paymentHistory.setUid(userId);
                paymentHistory.setUsername(username);
                paymentHistory.setPaymentDate(LocalDateTime.now());
                paymentHistory.setPaymentAmount(requestBody.get("amount"));

                Loaning loaning = new Loaning();
                loaning.setUid(userId);

                boolean paymentInserted = paymentHistoryService.insertPaymentHistory(paymentHistory);
                boolean debtUpdated = paymentHistoryService.updateDebtAmountByUid(userId, paymentHistory.getPaymentAmount());
                if (paymentInserted && debtUpdated) {
                    System.out.println("用户名是:" + username);
                    return R.ok("还款成功");
                } else {
                    return R.error("还款失败");
                }
            } else {
                return R.error("Token验证失败");
            }
        } catch (Exception e) {
            System.out.println("剩余金额是:" + requestBody.get("amount"));
            return R.error("处理请求时发生错误:" + e.getMessage());
        }
    }
}

json:

{
"amount": 100.0
}

在这个代码中,请求体直接解析为一个 Map<String, Double>,其中键是 "amount",值是请求体中的 "amount" 值。然后,根据JWT解析出的用户名和请求体中的 "amount",创建相应的对象进行操作。

使用 Map<String, Double> 只是一种示范,用来解析请求体中的数据,并提取出你需要的部分。这种做法适用于请求体中只包含少量字段的情况,但并不是通用的做法。

在这个特定的情况下,你的代码需要解析请求体中的 "amount" 字段,并将其与JWT中解析出的用户名一起使用。而你之前的代码中使用了 PaymentRequest 类来封装请求体中的 LoaningPaymentHistory,但现在你只需要 "amount" 字段,所以并不需要再使用一个完整的对象。

使用 Map<String, Double> 的思路是,直接将请求体中的 JSON 数据解析为一个简单的键值对(key-value)结构,其中键是字段名(例如 "amount"),值是字段对应的值(例如 100.0)。在这种情况下,你可以使用 "amount" 这个键从 Map 中获取对应的值,然后将这个值与解析出的用户名一起使用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot 中使用 Jackson 进行 JSON 转换时,可以考虑以下几个优化方案: 1. **使用配置类自定义 ObjectMapper**:Spring Boot 默认使用的是 Jackson 的 `ObjectMapper`,你可以创建一个配置类,并通过 `@Bean` 注解自定义一个全局的 ObjectMapper。在自定义的 ObjectMapper 中,你可以设置一些优化选项,如日期格式化、属性命名策略等,以满足你的需求。 ```java @Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); // 设置日期格式化 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // 设置属性命名策略 objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); // 可以添加更多的配置 return objectMapper; } } ``` 2. **使用视图类控制输出内容**:如果你只需要输出对象中的一部分字段,可以创建一个视图类来控制输出内容。通过 `@JsonView` 注解标记字段,并在需要输出的地方指定视图类,可以避免输出不必要的字段。 ```java public class Views { public static class Public {} public static class Internal extends Public {} } public class MyDto { @JsonView(Views.Public.class) private String publicField; @JsonView(Views.Internal.class) private String internalField; // getters and setters } ``` 3. **使用注解控制序列化和反序列化**:Jackson 提供了许多注解,可以更细粒度地控制序列化和反序列化过程。例如,你可以使用 `@JsonProperty` 注解重命名字段,在需要时使用 `@JsonFormat` 注解格式化日期等。 ```java public class MyDto { @JsonProperty("new_name") private String oldName; @JsonFormat(pattern = "yyyy-MM-dd") private Date date; // getters and setters } ``` 4. **使用 Lombok 简化实体类**:如果你使用 Lombok 来简化实体类的编写,可以使用 `@JsonAutoDetect` 注解来指定序列化和反序列化的可见性。这样可以避免生成过多的 getter 和 setter 方法。 ```java @Data @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) public class MyDto { private String field1; private String field2; } ``` 通过以上优化方案,你可以提高 Spring Boot 中 Jackson 的转换性能和灵活性。根据你的实际需求,选择适合的优化方案即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值