做接口开发最烦的,是解析JSON那么一个无聊的事情,会打断你的心流

29 阅读3分钟

本文是《微信支付回调里,为什么一行 data.order.amount 胜过五层判空》的思路延伸

做接口对接久了,我越来越反感一种代码:

明明只是取几个字段,却写成这样:

Object dataObj = response.get("data");
if (dataObj instanceof Map) {
    Map<String, Object> data = (Map<String, Object>) dataObj;

    Object orderObj = data.get("order");
    if (orderObj instanceof Map) {
        Map<String, Object> order = (Map<String, Object>) orderObj;

        Object amountObj = order.get("amount");
        if (amountObj instanceof Integer) {
            Integer amount = (Integer) amountObj;
        }
    }
}

它当然没错。但它有一个很严重的问题:

它会不断打断你对业务本身的思考。

更麻烦的是,这种打断不是只发生在第一次开发时:很多接口代码第一次写出来,也许只是显得啰嗦一点。真正难受的是,过几天接口结构一变,你还得回头钻进那一大段旧代码里,重新确认每一层判空、每一个中间变量、每一次强转,到底是不是还成立。

这是一种重复、枯燥,而且很容易出错的劳动。


做接口真正复杂的,从来不是取值,而是:

  • 状态怎么流转
  • 幂等怎么保证
  • 数据是否合法
  • 异常怎么补偿

经常!不管你是用Map来承载,还是用DTO, 我们都要把一些精力浪费在这些无聊的事情上:

  • 这一层是不是 null?
  • 这个值是什么类型?

很多时候接口变动,其实只是结构调整,例如

某个字段往里挪一层,某个对象换个名字,或者外面又包了一层节点,本质上都不算业务重写。

比如说:

data.order.amount   ->   data.payment.amount.value

按理说,这种改动应该只是:

改一个路径。

但如果你的代码是层层展开的:

你往往得回去:

  • 重读那一大段旧代码
  • 重新确认中间变量和判空
  • 担心漏掉某个强转或某个分支
  • 再做一轮回归测试

本来只是结构小改,最后却变成一次无聊的结构解析工作。


我想了个办法:一行路径访问,让变更点一眼可见

这样写

JSONMap response = new JSONMap(body);

Integer amount = response.getInt("data.order.amount");
String orderId = response.getStr("data.order.orderId");
String openid = response.getStr("data.user.openid");

只需要关心“这个字段到底从哪里取”就行了!!!

字段结构变了?没事,改这里就完事

response.getInt("data.payment.amount.value")

凉快乎?那是相当地凉快呀! 不用补判空,不用新增中间变量,也不用重新梳理整段解析逻辑


这不只是“代码更短”

真正的价值是:

你的注意力终于只需要 留给业务 了 接口结构变了,你顺着路径就知道该改哪里

而不是:

读旧代码 -> 判断 data空不空 → 判断 order空不空 → 判断类型对不对 → 再取 amount

这种清晰感,在要维护很多接口、很多字段的时候,会被不断放大。


结论

这才是做编程工作最宝贵的东西:

心流 —— 不该被无聊的简单工作打断的连续思路!

关于接口对接这件事,你们遇到过最头疼的问题是什么?


附:文中示例所用工具