python json.loads 中文_Python 的完美 json loads

python json.loads 中文_Python 的完美 json loads为了对付表单提交时参数多和json结构复杂的情况,我写了一个名为recursive_json_loads的处理函数来对请求对象递归调用json.loads()以期能够一次性将所有参数转化为更好用的Python类型。后来又发现了web.py的Storage对象,使这个函数越发好用起来。lang:pythonimportsimplejsonasjsondefrecurs…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

为了对付表单提交时参数多和 json 结构复杂的情况,我写了一个名为 recursive_json_loads 的处理函数来对请求对象递归调用 json.loads() 以期能够一次性将所有参数转化为更好用的 Python 类型。后来又发现了 web.py 的 Storage 对象,使这个函数越发好用起来。

lang:python

import simplejson as json

def recursive_json_loads(data):

if isinstance(data, list):

return [recursive_json_loads(i) for i in data]

elif isinstance(data, tuple):

return tuple([recursive_json_loads(i) for i in data])

elif isinstance(data, dict):

return Storage({recursive_json_loads(k): recursive_json_loads(data[k]) for k in data.keys()})

else:

try:

obj = json.loads(data)

if obj == data:

return data

except:

return data

return recursive_json_loads(obj)

class Storage(dict):

“””

A Storage object is like a dictionary except `obj.foo` can be used

in addition to `obj[‘foo’]`.

>>> o = storage(a=1)

>>> o.a

1

>>> o[‘a’]

1

>>> o.a = 2

>>> o[‘a’]

2

>>> del o.a

>>> o.a

Traceback (most recent call last):

AttributeError: ‘a’

“””

def __getattr__(self, key):

try:

return self[key]

except KeyError as k:

raise AttributeError(k)

def __setattr__(self, key, value):

self[key] = value

def __delattr__(self, key):

try:

del self[key]

except KeyError as k:

raise AttributeError(k)

def __repr__(self):

return ”

用法如下:

lang:python

>>> request = json.dumps({“foo”:[“a”, 123], “bar”: {1:”int”, “str”:”05″}})

>>> data = recursive_json_loads(request)

>>> data.foo

[‘a’, 123]

>>> data.bar

>>> data.bar.str

’05’

>>> data.bar[1]

‘int’

至于是否应该把 Storage 的 self[key] 改成 self.get(k),从而避免在访问不存在的值时触发属性异常。想了一下感觉不大好,主要是并没有把参数检查的代码简化多少。

说到参数检查,一般可以做三步:

是否传了某个参数 (?k)

参数值是否为空 (?k=)

参数的类型/值是否符合要求(?k=0)

有一点需要注意的是,对于传了参数而没有传值的情况(?k=),k 的值会是 ”,而且 isinstance(”, str) 会返回 True。

对于必须参数,通常第二和第三步是一起完成的,比如:

lang:python

if not hasattr(data, ‘k’) or not isinstance(data.k, int):

return error()

但非必须参数就要单独考虑第二种情况了,因为第二种也是合法的:

lang:python

if hasattr(data, ‘k’) and data.k != ” and not isinstance(data.k, int):

return error()

因为 Python 会把很多种如 len() 为零的对象的布尔值判断为 False,所以上面始终没有使用 if data.k: 这样的写法,以避免误判。

补充,Storage 类的一个缺点是:他有 __dict__ 属性,但该属性永远为空

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/230890.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 使用随机函数rand()和srand()来产生三个_随机函数怎么按

    使用随机函数rand()和srand()来产生三个_随机函数怎么按srand函数是随机数发生器的初始化函数。原型:voidsrand(unsignedintseed);srand和rand()配合使用产生伪随机数序列。rand函数在产生随机数前,需要系统提供的生

    2022年8月1日
    8
  • jira使用教程_jira 工具

    jira使用教程_jira 工具JIRA使用教程:在Windows上安装JIRA JIRA使用教程:在Linux上安装JIRA JIRA使用教程:使用文件包安装JIRA JIRA使用教程:创建项目 JIRA使用教程:创建问题 JIRA使用教程:搜索问题 JIRA使用教程:编辑项目键 JIRA使用教程:简单问题跟踪 JIRA使用教程:创建软件开发项目 JIRA使用教程:共享搜索结果 JIRA使用教程:查看项目…

    2025年8月25日
    4
  • 磁盘阵列技术

    磁盘阵列技术一、磁盘阵列实现方式磁盘阵列有两种方式可以实现,那就是“软件阵列”与“硬件阵列”。软件阵列是指通过网络操作系统自身提供的磁盘管理功能将连接的普通SCSI卡上的多块硬盘配置成逻辑盘,组成阵列。如微软的WindowsNT/2000Server/Server2003和NetVoll的NetWare两种操作系统都可以提供软件阵列功能,其中WindowsNT/2000Server/Serv

    2022年5月23日
    26
  • Windows 强制删除文件及文件夹命令「建议收藏」

    Windows 强制删除文件及文件夹命令「建议收藏」一、删除文件或目录CMD命令rd/s/q盘符:\某个文件夹  (强制删除文件文件夹和文件夹内所有文件)del/f/s/q盘符:\文件名  (强制删除文件,文件名必须加文件后缀名)二、删除文件或目录BAT命令1、新建.BAT批处理文件输入如下命令,然后将要删除的文件拖放到批处理文件图标上即可删除。DEL/F/A/Q RD/S/Q …

    2022年6月1日
    50
  • 台式计算机网线,台式电脑连接网线的是哪里 台式电脑怎么连接wifi步骤

    台式计算机网线,台式电脑连接网线的是哪里 台式电脑怎么连接wifi步骤4999或者运营商的问题,方法有哪些,我的笔记本和台式机都是10,联想启天4155,笔记本连的路由器的无线,用(wifi调试桥台式机电脑)使用脚本辅助微连接台式电脑连接信小程序跳一跳简单实用教程新人适用一wifi条龙附带资源,只有网线,另一种可能度出问题了,28访问量,什么叫做二次开发,惠普连接暗影精台式电脑连接灵5,连接对于家中台式电脑连接路由电脑怎样器还有连wifi接猫的用户,台式电脑,热门台…

    2022年6月26日
    28
  • mysql utf8占几个字节_utf-8的中文是一个字符占几个字节

    mysql utf8占几个字节_utf-8的中文是一个字符占几个字节英文字母和中文汉字在不同字符集编码下的字节数英文字母:·字节数:1;编码:GB2312字节数:1;编码:GBK字节数:1;编码:GB18030字节数:1;编码:ISO-8859-1字节数:1;编码:UTF-8字节数:4;编码:UTF-16字节数:2;编码:UTF-16BE字节数:2;编码:UTF-16LE中文汉字:字节数:2;编码:GB2312字节数:2;编…

    2022年6月26日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号