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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java中输出数组元素的方法[通俗易懂]

    java中输出数组元素的方法[通俗易懂]定义一个数组:int[]array=newint{5,2,3,8};方法一:for(inti=0;i<array.length){ System.out.println(array[i]);}方法二:importjava.util.Arrays;System.out.println(Array.toString(array))方法三:…

    2022年10月11日
    2
  • PyCharm 教程(五)断点 调试[通俗易懂]

    PyCharm 教程(五)断点 调试[通俗易懂]PyCharm作为IDE,断点调试是必须有的功能。否则,我们还真不如用纯编辑器写的快。【运行】和【调试】前的设置,详见前面的文章,helloword。1,设置断点在代码前面,行号的后面,鼠标单击,就可以设置断点。如下:2,调试断点点击那个绿色的甲虫图标(似乎甲虫已经成为debug专用图标了),进行断点调试。点击后,会运行到第一个断

    2022年5月21日
    32
  • WPF Visifire 入门-动态曲线图[通俗易懂]

    WPF Visifire 入门-动态曲线图[通俗易懂]kagula2019-3-18这里用源代码的形式,示范如何画出一个最简单的动态曲线图。开发环境,Visualstudio2017CommunityUpdate5项目类型:WPFC#.NetFramework4.6.1本文适用对象:有两年没有开发C#WPF的程序员,通过这个示例可以快速回忆。下面是运行效果图,不停显示最新生成的十个数据点。让…

    2022年7月21日
    13
  • oracle数据库基础教程_象棋初学者入门教程

    oracle数据库基础教程_象棋初学者入门教程https://www.cnblogs.com/kscnchina/p/4570865.html非常非常推荐这个教程

    2022年9月25日
    4
  • php调用webservice

    php调用webservice

    2021年7月9日
    83
  • ftp服务器搭建并通过外网访问

    ftp服务器搭建并通过外网访问内网 FTP 如何端口映射到外网连接访问 通过公网路由器映射或 nat123 端口映射均可实现 前者是硬件公网端口映射 后者是软件内网端口映射 目的一样 方法不一 工具 原料 FTP 内网 nat123

    2025年12月10日
    3

发表回复

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

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