记一个python字典和json.dumps()的坑(代码片段)

不要挡着我晒太阳 不要挡着我晒太阳     2022-12-24     638

关键词:

最近项目中需要与管易云erp做对接,看了他的接口文档,php的示例代码,于是用python仿写。

其中传的参数data中前面几个json数据是固定的,最后需要加一个签名,该签名是对前面的json数据字符串化后,首尾拼接上screct字符串,再做md5处理(32位大写),再将该签名添加到之前的json中作为post参数传递过去。

问题就出在组装json字符串和签名中,因为python内置的字典是无序的,导致我组装好的json数据作为参数传递给自己编写的签名函数时,字典内部的顺序是变化的,所以签名前后的md5值不一样,导致频频报错,自己起初没在意数据顺序的事,因为对接金蝶erp时没有签名这一项,数据传递的很简单,导致排错时方向出现错误。后来想到这了顾开始解决。

解决方法是使用collections库中的OrderedDict(有序字典)模块,组装好的数据就不会乱序,做的md5签名也就前后一致了

但,在对json数据使用json.dumps()方法时,字符串化后的数据在逗号后会有一个空格,导致md5值出错

原理:

 

 

 

解决方法是

json.dumps(data,separators=(\',\',\':\'))

最后,将自己写的函数留下来做个例子

def getShops():
    data = OrderedDict()
    data["appkey"] = appkey
    data["sessionkey"] = sessionkey
    data["method"] = method
    data["page_no"] = "1"
    data["page_size"] = "10"
    data["sign"] = sign(data,secret)
    
    response = requests.post(url=url, data=json.dumps(data))
    print(response.text)


def sign(data,secret):
    str = json.dumps(data,separators=(\',\',\':\'))
    fullStr = secret+str+secret
    signCode = hashlib.md5(fullStr.encode("utf-8")).hexdigest().upper()
    #print(signCode)
    return signCode

 

 

再访问新增订单接口时,又报签名出错,按着之前的逻辑去查,发现json.dumps()含中文数据时,会将中文默认转为ascii码,从而导致MD5不一致,需转成中文才行

原理:

def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
        allow_nan=True, cls=None, indent=None, separators=None,
        default=None, sort_keys=False, **kw):

解决:将上述代码红色参数改为False即可。

 

[python]一些常用的python知识总结

...son.dumps()和json.loads()是json格式处理函数json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,json.dumps()函数是将字典转化为字符串)json.loads()函数是将json格式数据转换为字典(可以这么理解,json.loads()函... 查看详情

什么是序列化,python中json的load,loads,dump,dumps和pickle的load,loads,dump,dumps的区别

...son序列化的是字典类型的数据类型)   Python把一个字典序列化到一个文本文件中,使用json.dump或者dumps,如下:importjsondic={‘name‘:‘ljj‘,‘age‘:18}data=json.dumps(dic)f=open(‘json_t 查看详情

python中json文件处理涉及的四个函数json.dumps()和json.loads()json.dump()和json.load()的区分(代码片段)

一、概念理解1、json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串)  (1)json.dumps()将字典转化为字符串  (2)json.loads()将字符串转化为字典2、json.dump()和json.load()主要用来读写json文件函数  (1)json.dump()将... 查看详情

打印对象的属性,如 json.dumps 打印一个字典 [重复]

】打印对象的属性,如json.dumps打印一个字典[重复]【英文标题】:Printanobject\'sattributeslikejson.dumpsprintsadict[duplicate]【发布时间】:2016-03-1416:53:31【问题描述】:编辑:这个答案中有一个解决方案:Howtouseadot“.”toaccessmembersofdiction... 查看详情

python读写json文件(dump,load),以及对json格式的数据处理(dumps,loads)

...ctNotation)是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。1、json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) json.dumps()函数是将一个Python数据类型列表进行json格式的编码(可以这么理解,js... 查看详情

Python json.dumps() 将我的所有数据输出到一行,但我希望每个条目都有一个新行

...umps()将我的所有数据输出到一行,但我希望每个条目都有一个新行【英文标题】:Pythonjson.dumps()outputsallmydataintoonelinebutIwanttohaveanewlineforeachentry【发布时间】:2021-02-2405:12:06【问题描述】:我正在使用Python和一些json数据。我正在... 查看详情

python处理json数据(代码片段)

...据格式与Python数据结构非常相似,因此Python中提供了一个json模块,用于编码和解码JSON数据。编码JSON在Python中,我们可以使用json.dumps()方法将Python对象编码为JSON格式的字符串。例如,将一个字典对象编码为JSON格... 查看详情

python-json处理

1、json串就是字符串2、需要提前引入,即import3、将list/字典等转化为json数据类型:json.dumps()#json.dumps(d)#把list字典转为json#json.dumps(d,indent=8)#把list字典转为json,indent缩进#json.dumps(d,indent=8,ensure_ascii=False)#可以显示这中文importjsond 查看详情

python中json.dump()和json.dumps()有那些区别?

...其他序列化函数库如pickle的接口少得多。下面演示如何将一个Python数据结构转换为JSON:importjsondata={'name':'ACME','shares 查看详情

json.dumps 和 json.load 有啥区别? [关闭]

...问题描述】:json.dumps和json.load有什么区别?据我了解,一个将JSON加载到字典中,另一个加载到对象中。【问题讨论】:【参 查看详情

python接口测试之json模块的使用

json.dumps()json.loads()json.dumpjson.load一、json.dumps()将python字典类型转换成json对象importjson#Python字典类型转换为JSON对象data={‘no‘:1,‘name‘:‘Runoob‘,‘url‘:‘http://www.runoob.com‘}json_str=json.dumps(data)print("Pyt 查看详情

python爬虫编程思想(78):json字符串与字典互相转换(代码片段)

...eval函数两种方法将JSON字符串转换为字典。importjson#定义一个字典data=\'name\':\'Bill\',\'company\':\'Microsoft\',\'age\':34#将字典转换为JSON字符串jsonStr=json.dumps(data)# 查看详情

python中使用json.dumps()代替str()保留字典中的双引号

参考技术APython里的字典,其键值对使用双引号。当使用str()转换成字符串后,发现双引号变成了单引号,若想要保留双引号,可使用json.dumps()代替str()。示例:importjsondefmain():  dict="1":"aa","2":"bb&qu... 查看详情

pythonpython和json数据的相互转化(代码片段)

...。可以按照JSON指定的格式去组织和封装数据。JSON本质是一个带有特定格式的字符串。JSON是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据的传递和交互。JSON的数据格式和Python中的字典一样,或者是... 查看详情

python中json处理

...)、json.load()、json.dump()。1)json.dumps()    将一个Python数据类型dict进行json格式的编码(字典->字符串)  eg:    age_dict='age1':'12','age2':'15'    json_info=json.du... 查看详情

python中的json.dump()和json.dumps()有啥区别?

】python中的json.dump()和json.dumps()有啥区别?【英文标题】:Whatisthedifferencebetweenjson.dump()andjson.dumps()inpython?python中的json.dump()和json.dumps()有什么区别?【发布时间】:2016-07-0317:18:17【问题描述】:我在this官方文档中搜索了python中jso... 查看详情

python面试必考重点之列表,元组和字典第十六关——python字典与json字符串如何互转(代码片段)

...关函数的使用第二部分——面试题:1.面试题一:python字典与json字符串如何互转?第三部分——解析:面试题一之python字典与json字符串如何互转?importjsond='a':123,'b':'456','c':'xyz'... 查看详情

python的json模块的dumps,loads,dump,load方法介绍

...化的对象d_json=json.dumps({‘a‘:1,‘b‘:2}),在这里d_json是一个字串‘{"b":2,"a":1}‘d=json.loads(d_json) #{ b":2,"a":1},使用load 查看详情