python3 json.dumps结果多出空格处理

最近用python写接口测试用例,发现一个比较新奇的问题,记录一下:

接口传参需要签名校验,签名方法是取所有参数的md5再拼接起来,如果参数是二维数组,需要先json化,下面是计算签名的例子:

# coding = utf-8

import hashlib
import json


def get_md5_value(string):
    m = hashlib.md5()
    m.update(string.encode('utf-8'))
    return m.hexdigest()


def generate_sign(params):
    str_to_be_sign = ''
    for key in sorted_params:
        if isinstance(params[key], list):
            str_to_be_sign = str_to_be_sign + key + json.dumps(params[key])
        else:
            str_to_be_sign = str_to_be_sign + key + str(params[key])
    return get_md5_value(str_to_be_sign)


if __name__ == '__main__':
    param = {'data1': [{'data_id': 123}], 'data2': 0, 'time': '2019-01-15 10:01:27'}
    print(generate_sign(param))

之前几个接口参数中没有数组也还挺正常,今天碰到一个带数组的参数,接口一直返回签名错误,也跟开发确认过参数列表没有问题,那只能是签名的计算出问题了,把md5之前的字符串打印出来发现{'data_id': 123}的冒号后面多了一个空格。。。,而data2与0之间又没有。。。先是用最简单粗暴的方法,把md5前字符串中的": "replace成":"去掉空格是可以了,就是感觉治标不治本。

再比较一下带不带数组区别就只有数组需要先经过json.dumps处理,找一找发现原来就是dumps处理时候,有个分隔符参数,未指定时默认是(", ", ": "),都是带空格的...,所以按照文档说明,指定分隔符为(":", ",")就可以了。后续如果有其它地方需要避免json化后出现空格的,就需要指定这个分隔符了。

if isinstance(params[key], list):
    str_to_be_sign = str_to_be_sign + key + json.dumps(params[key], separators=(',', ':'))

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值