zoukankan      html  css  js  c++  java
  • Python json转字符串的一些细节

          要调PHP那边的接口,php那边一直都校验不过,很是郁闷。没办法,只能让人把发送成功的代码拿过来看,不过是php写的,步骤都是一样:

    php端:

      1. json对象转json字符串.

      2. 对json字符串base64.

      3. 加入一些其他变量与2得到的base64进行md5

    php运行成功,但python一直都不过,把php的变量都打印了出来,前后对比了很多次,发现,有两个不同的地方:

    1. python里json转字符串,默认的是有indent,即多一个空格的。这点跟php里的json_encode()方法不同,php里没有空格。

    2. python如果用dict,转成字符串无法保证字符串顺序,这点导致得到的base64跟php的不同。

    就是这两点,才导致python调用接口一直验证不过。

    解决:

    对于1. 查看json模块的dumps方法源码,发现有个separators参数,设置为 (',', ':') 即可。

    对于2. 使用collection模块里的OrderedDict类,可以保证字符串顺序

    代码片段:

    from collections import OrderedDict
        
    # 这里要保护json转字符串顺序,不然php那边校验不过
    inner = OrderedDict(
           [("tab", OrderedDict([("type", "exp"), ("value", 1)]))]
    )
    
    code = OrderedDict(
           [("user", 23445),
             ("api", 2364),
            ("guid", '3f60614f-315d-11e7-b690-f8bc127f78d8'),
            ("cmds",inner)]
    )
    # 这里就是顺序的字符串
    json.dumps(code, encoding="UTF-8", separators=(',', ':'))
  • 相关阅读:
    【基础】Oracle 表空间和数据文件
    oracle学习笔记1:windows下oracle数据库安装及.net调用oracle数据库
    redis中文网站
    .NET中的消息队列
    .Net下的进程间的通讯 -- Windows消息队列
    1060 最复杂的数(反素数玄学dfs)
    1282 时钟(最小表示法+hash)
    1191 消灭兔子(贪心+优先队列)
    1366 贫富差距(floyed)
    1503 猪和回文(DP)
  • 原文地址:https://www.cnblogs.com/cool-fire/p/6814441.html
Copyright © 2011-2022 走看看