为了对付表单提交时参数多和 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__ 属性,但该属性永远为空

python json.loads 中文_Python 的完美 json loads相关推荐

  1. python json dumps 中文_Python下调用json.dumps中文显示问题解决办法

    在采集回来的网页内容要存储为TXT,因为数据结果是一个Dic的,所以将其换为Json. 但是转换的过程中汉字变为了ascii编码格式了!通过help("json") 看到里面有一个 ...

  2. python json序列化对象_Python学习之json序列化

    一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...

  3. python正则匹配中文_python 正则表达式匹配中文-阿里云开发者社区

    python 正则表达式匹配中文 文件编码为 utf-8 设置默认编码为 utf-8 中文需要转换为 \u 形式的编码,也就是  编码, 轮换方法,cmd 下执行 python 进入 python 命 ...

  4. 在python中使用中文_Python中使用中文的方法

    python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识.当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了. 先来看看pytho ...

  5. python csv写入中文_python写入csv中文乱码问题,encoding='utf-8'无效还是乱码——吕江民·日常随笔...

    今天在处理python写入csv中文乱码问题,尝试各种办法,百思不得其解,网上找到的最常用的办法就是 1. encoding='utf-8':无效 with open('data4.csv', 'a' ...

  6. python怎么转中文_Python中文全攻略【转】

    这几天一直纠结月python的中文编码问题,发现一篇不错的文章,转过来留个念想. 1.在Python中使用中文 在Python中有两种默认的字符串:str和unicode.在Python中一定要注意区 ...

  7. python json解析方法_Python 中的 JSON 方式讲解

    Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化,代码如下:import json class Stude ...

  8. python爬取json简单吗_Python爬取Json数据的示例

    Python教程栏目介绍爬取Json数据实例 相关免费学习推荐:python教程(视频) 本文中以爬取其中的AI流转率数据为例. 该地址返回的响应内容为Json类型,其中红框标记的项即为AI流转率值: ...

  9. python json格式转换_Python实现把json格式转换成文本或sql文件

    python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...

最新文章

  1. 不需要显示地图 就获得用户当前经纬度 超简单的方法
  2. 自动打包Shell脚本
  3. linux用户变量设置位置,linux---位置参数
  4. SPOJ 694 Distinct Substrings(后缀数组)
  5. 华为鸿蒙系统支持智慧多屏吗,搭载鸿蒙OS!华为宣布企业智慧屏:多屏协同、底座带轮子...
  6. sqlserver2000 php5.4,PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4
  7. 0x84bb0001 sqlserver_sqlserver 2000 远程连接 服务器的解决方案
  8. 第二章 PX4-Pixhawk-RCS启动文件解析
  9. Qt工作笔记-MineData相关基本操作
  10. TAB三巨头虚拟币的运用
  11. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
  12. LinkedList线程安全问题
  13. 转: utf16编码格式(unicode与utf16联系)
  14. Linux中的静态库和动态库简介及生成过程示例
  15. Android native memory leak detect (Android native内存泄露检测)
  16. LBP算法及其改进算法
  17. 关于51芯片及引脚功能介绍与总结
  18. html 引入 svg矢量图,前端可视化——SVG矢量图技术
  19. 计算机视觉经典书籍推荐
  20. 算法高级(29)-电影《源代码》中蕴含的回溯算法介绍

热门文章

  1. 新建计算机用户名自动覆盖原来,win10系统让新建账户直接覆盖administrator账户的设置技巧...
  2. 解决OpenCV在Cmake时,因网络问题无法下载部分所需文件
  3. 修改订单html,修改保洁订单.html
  4. ibatis报错:无效的列索引
  5. 安装Scrapy失败?一分钟教你解决!(win10 + Python3.6(64bit)下)
  6. 【小甲鱼零基础入门学python】学习总结之字典
  7. C#进阶学习--抽象方法(abstract)
  8. 长沙理工大学第十二届ACM大赛 I.主持人的烦恼【贪心】
  9. python pywin32教程,pywin32教程
  10. 【JS继承】常见的7种继承方式