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


相关推荐

  • c++多线程入门_c语言是单线程还是多线程

    c++多线程入门_c语言是单线程还是多线程多线程的优势线程创建更加快速线程间切换更加快速线程容易终止线程间通讯更快速C语言的多线程可以通过gcc编译器中的pthread实现。案例1:helloworld#include<stdio.h>#include<pthread.h>void*myfunc(void*args){printf(“helloworl…

    2022年10月21日
    3
  • 实战篇:SUSE 15 SP3 安装 Oracle 19C RAC 数据库「建议收藏」

    实战篇:SUSE 15 SP3 安装 Oracle 19C RAC 数据库「建议收藏」从零开始SUSE15SP3安装Oracle19CRAC数据库!

    2022年7月21日
    52
  • 嵌入式linux基础学习全套精品视频教程

    嵌入式linux基础学习全套精品视频教程嵌入式linux基础学习全套精品视频教程在给大家分享教程之前,首先给大家简要的介绍一下嵌入式linux,嵌入式linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。本教程是嵌入式linux基础学习全套精品视频教程,比较适合嵌入式初级学员们学习,需要

    2022年5月16日
    48
  • 平面方程_平面方程一般式的ABCD

    平面方程_平面方程一般式的ABCD参考网址:http://www.lsngo.net/2018/01/07/graphics_plane/这里将点法式展开即可得到:所以上面式子中的D=-n点乘p,n是法向量,p为坐标点,都是三维的,注意负号。这句话又是什么意思?P=<n,D>,就是四维向量。任意一点的齐次坐标为(x,y,z,1),两个点乘,得到Ax+By+Cz+D=0,其实就是P点乘Q。所以平面可以…

    2025年8月12日
    1
  • DB2 DECODE函数

    DB2 DECODE函数DB2DECODE函数的用法:在查询数据,需要进行条件判断时,一般我们使用CASE…WHEN实现,当判断条件为相等时,除了使用CASE…WHEN实现,还可以使用DECODE函数。若要使用like、>、DECODE()使用方法: decode(条件,值1,翻译值1,值2,翻译值2,…值n,翻译值n,缺省值)DECODE()含义说明:IF条件=值1THEN

    2022年7月25日
    36
  • idea2021激活码mac版本破解方法

    idea2021激活码mac版本破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    872

发表回复

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

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