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__ 属性,但该属性永远为空

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 小明加密通道进入_门禁系统跟闸机通道的区分是什么?功能是一样吗

    小明加密通道进入_门禁系统跟闸机通道的区分是什么?功能是一样吗门禁系统属于一卡通系统的范畴。它是以中央处理器为核心,由控制器、信息采集器和电控锁组成的控制网络系统。通过系统的信息读取和处理,实现了各种门锁开关的自动控制。根据信息阅读的方式可以分为:插卡式、感应式、图像检测式、双眼虹膜识别式等。他们的技术含量和体系工程预算顺序先后提高。且融合三辊闸、摆闸、翼闸等多种入口处监管设施,保持更智能。门禁用到ID和IC两种卡片,IC门禁有加密功能,存贮容量也大,广泛用…

  • encodeURIComponent编码后java后台的解码

    encodeURIComponent编码后java后台的解码

  • 加密狗android,Android系统加密狗的设计与实现

    加密狗android,Android系统加密狗的设计与实现摘要:随着IT产业的迅猛发展,软件作为IT产业中的一项重要产品,现在已经随着电脑进入千家万户,深入到用户生活中的每个地方。但是针对软件,有一个问题一直存在,那就是软件盗版的问题。随着软件影响范围的扩大,盗版软件带来的危害也是越发的严重。另外,智能手机也已经进入一个高速发展期,Android系统手机在智能手机市场中占据很大的一块份额。在这样的背景下,本文提出一种使用Android系统手机对软件进行…

  • Hadoop 中xsync集群分发脚本

    Hadoop 中xsync集群分发脚本大数据集群中使用xsync脚本分发文件到集群中的所有机器

  • MT4安卓版官网下载[通俗易懂]

    MT4安卓版官网下载[通俗易懂]目前,mt4因为特有的优势,吸引了许多投资者使用。MT4是目前最受欢迎的外汇交易平台。如果你的手机是安卓手机,要使用mt4交易,首先就得下载一个安卓版的软件。那么安卓如何下载呢。

  • ListView 排序问题[通俗易懂]

    ListView 排序问题[通俗易懂] 在DataGrid 中有自带的排序,但是在ListeView中却没有这一项,下面就给出我平时用的ListView的排序使用方法,给志同道合的朋友们参考参考:在ColumnClick事件下添加:其中要注意:intsortColumn=-1;其中sortColumn用来记录上次排序的列的索引privatevoidlistView1_ColumnClick(objectse

发表回复

您的电子邮箱地址不会被公开。

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