python json.loads 中文_Python 的完美 json loads
为了对付表单提交时参数多和 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相关推荐
- python json dumps 中文_Python下调用json.dumps中文显示问题解决办法
在采集回来的网页内容要存储为TXT,因为数据结果是一个Dic的,所以将其换为Json. 但是转换的过程中汉字变为了ascii编码格式了!通过help("json") 看到里面有一个 ...
- python json序列化对象_Python学习之json序列化
一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...
- python正则匹配中文_python 正则表达式匹配中文-阿里云开发者社区
python 正则表达式匹配中文 文件编码为 utf-8 设置默认编码为 utf-8 中文需要转换为 \u 形式的编码,也就是 编码, 轮换方法,cmd 下执行 python 进入 python 命 ...
- 在python中使用中文_Python中使用中文的方法
python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识.当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了. 先来看看pytho ...
- python csv写入中文_python写入csv中文乱码问题,encoding='utf-8'无效还是乱码——吕江民·日常随笔...
今天在处理python写入csv中文乱码问题,尝试各种办法,百思不得其解,网上找到的最常用的办法就是 1. encoding='utf-8':无效 with open('data4.csv', 'a' ...
- python怎么转中文_Python中文全攻略【转】
这几天一直纠结月python的中文编码问题,发现一篇不错的文章,转过来留个念想. 1.在Python中使用中文 在Python中有两种默认的字符串:str和unicode.在Python中一定要注意区 ...
- python json解析方法_Python 中的 JSON 方式讲解
Python的dict对象可以直接序列化为JSON的{},不过,很多时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化,代码如下:import json class Stude ...
- python爬取json简单吗_Python爬取Json数据的示例
Python教程栏目介绍爬取Json数据实例 相关免费学习推荐:python教程(视频) 本文中以爬取其中的AI流转率数据为例. 该地址返回的响应内容为Json类型,其中红框标记的项即为AI流转率值: ...
- python json格式转换_Python实现把json格式转换成文本或sql文件
python如何将json格式的数据快速的转化成指定格式的数据呢?或者转换成sql文件? 下面的例子是将json格式的数据准换成以#_#分割的文本数据,也可用于生成sql文件. [root@bogon ...
最新文章
- 不需要显示地图 就获得用户当前经纬度 超简单的方法
- 自动打包Shell脚本
- linux用户变量设置位置,linux---位置参数
- SPOJ 694 Distinct Substrings(后缀数组)
- 华为鸿蒙系统支持智慧多屏吗,搭载鸿蒙OS!华为宣布企业智慧屏:多屏协同、底座带轮子...
- sqlserver2000 php5.4,PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4
- 0x84bb0001 sqlserver_sqlserver 2000 远程连接 服务器的解决方案
- 第二章 PX4-Pixhawk-RCS启动文件解析
- Qt工作笔记-MineData相关基本操作
- TAB三巨头虚拟币的运用
- 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
- LinkedList线程安全问题
- 转: utf16编码格式(unicode与utf16联系)
- Linux中的静态库和动态库简介及生成过程示例
- Android native memory leak detect (Android native内存泄露检测)
- LBP算法及其改进算法
- 关于51芯片及引脚功能介绍与总结
- html 引入 svg矢量图,前端可视化——SVG矢量图技术
- 计算机视觉经典书籍推荐
- 算法高级(29)-电影《源代码》中蕴含的回溯算法介绍
热门文章
- 新建计算机用户名自动覆盖原来,win10系统让新建账户直接覆盖administrator账户的设置技巧...
- 解决OpenCV在Cmake时,因网络问题无法下载部分所需文件
- 修改订单html,修改保洁订单.html
- ibatis报错:无效的列索引
- 安装Scrapy失败?一分钟教你解决!(win10 + Python3.6(64bit)下)
- 【小甲鱼零基础入门学python】学习总结之字典
- C#进阶学习--抽象方法(abstract)
- 长沙理工大学第十二届ACM大赛 I.主持人的烦恼【贪心】
- python pywin32教程,pywin32教程
- 【JS继承】常见的7种继承方式