Python下将一般对象打印成Json
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/12741423.html 作者:窗户 QQ/微信:6679072 E-mail:6679072@qq.com
有的时候,我们写Python程序需要处理复杂对象,过程中调试可能需要去看看产生的对象如何,我们可以把它打印成json来看,这是个不错的办法。
对每一个对象写一个独立的打印成json的程序是个不能复用的工作,我们可以考虑通用的写法,好在Python的反射可以帮我们做到这一点,以下为我晚上所写,所有的成员名字按字典排布打印。
from functools import reduce
make_json = lambda blanks,obj : \
(lambda t, cut : \
'null' if obj==None \
else str(obj) if t in (int,float) \
else ('true' if obj else 'false') if t==bool \
else '"%s"'%obj if t==str \
else '[' + cut(reduce(lambda r,x:r+',\n'+' '*(blanks+2)+make_json(blanks+2,x), obj, '')) \
+ '\n' + ' '*blanks + ']' if t in (list, tuple) \
else '{' + cut(reduce(lambda r,x:r+',\n'+' '*(blanks+2)+'"%s" : '%x+make_json(blanks+2,obj[x]), \
sorted(filter(lambda x:type(x)==str,obj.keys())), '')) + '\n' + ' '*blanks + '}' if t==dict \
else reduce(lambda r,x:r+'%02x'%x, list(map(int, obj)),'"')+'"' if t==bytes \
else '{' + cut(reduce(lambda r,x:\
r+',\n'+' '*(blanks+2)+'"%s" : '%x+make_json(blanks+2,obj.__dict__[x]), \
sorted(filter(lambda x:len(x)<4 or x[:2]!='__' \
or x[-2:]!='__',obj.__dict__.keys())), '')) + '\n' + ' '*blanks + '}') \
(type(obj), lambda x:x if x=='' else x[1:]) print_json = lambda obj, fprint : fprint(make_json(0, obj))
以上的print_json就是打印json的函数,fprint是一个接打印字符串的函数,这里你当然可以随便打印到哪里。
我们测试如下:
class class1:
def __init__(self):
self.a1 = None
self.b1 = None
self.c1 = None class class2:
def __init__(self):
self.a2 = None
self.b2 = None
self.c2 = None class class3:
def __init__(self):
self.a3 = None
self.b3 = None
self.c3 = None test_obj = class1()
test_obj.a1 = [1, None, 2.5, class2(), True]
test_obj.a1[3].a2 = [class3(), class3()]
test_obj.a1[3].a2[0].a3 = [1, 2, 3]
test_obj.a1[3].a2[0].b3 = ["test1", "test2"]
test_obj.a1[3].a2[0].c3 = None
test_obj.a1[3].a2[1].a3 = [5, 6, 7]
test_obj.a1[3].a2[1].b3 = ["test3", "test4"]
test_obj.a1[3].a2[1].c3 = [True, False]
test_obj.a1[3].b2 = {"x":1, "y":2}
test_obj.a1[3].c2 = type('', (), {"x":10, "y":20})
test_obj.b1 = 100
test_obj.c1 = "test"
print_json(test_obj, print)
以上构建了一个test_obj对象,并打印出来。
{
"a1": [
1,
null,
2.5,
{
"a2": [
{
"a3": [
1,
2,
3
],
"b3": [
"test1",
"test2"
],
"c3": null
},
{
"a3": [
5,
6,
7
],
"b3": [
"test3",
"test4"
],
"c3": [
true,
false
]
}
],
"b2": {
"x": 1,
"y": 2
},
"c2": {
"x": 10,
"y": 20
}
},
true
],
"b1": 100,
"c1": "test"
}
这是一个标准的json,显然print_json函数是可用的。Python2里print是个命令,所以需要包装成一下。
如果上述想打印到文件,你可以
json_file = open('test_obj.json', 'w')
print_json(test_obj, lambda s:print(s, file=json_file))
json_file.close()
声明:以上代码作者是我本人(Colin Cai),可以随便使用,不受任何约束,如出现任何错误与损失均和笔者无任何关系!
Python下将一般对象打印成Json的更多相关文章
- 将java对象转成json字符串
如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...
- 将Model对象转换成json文本或者json二进制文件
将Model对象转换成json文本或者json二进制文件 https://github.com/casatwy/AnyJson 注意:经过测试,不能够直接处理字典或者数组 主要源码的注释 AJTran ...
- 编写Python脚本把sqlAlchemy对象转换成dict的教程
编写Python脚本把sqlAlchemy对象转换成dict的教程 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操 ...
- Newtonsoft.Json 把对象转换成json字符串
var resultJson = new { records = rowCount, page = pageindex, //总页数=(总页数+页大小-1)/页大小 total = (rowCount ...
- json 字符串转换成对象,对象转换成json字符串
json 字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法: [注意jquery版本问题] var str = '{"name":&qu ...
- DataTabel DataSet 对象 转换成json
public class DataTableConvertJson { #region dataTable转换成Json格式 /// <summary> ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- JSON对象转换成JSON字符串
1.问题背景 有一个json对象,需要将其转换成json字符串 JSON.stringify(obj) 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DT ...
- Gson把对象转成json格式的字符串
近期在做一个java web service项目,须要用到jason,本人对java不是特别精通,于是開始搜索一些java平台的json类库. 发现了google的gson.由于之前对于protoco ...
随机推荐
- django中间件 csrf auth认证
django中间件 能做全局访问频率限制,身份校验,黑名单,白名单 用法: 新建一个文件夹,文件夹新建一个py文件,文件中写如下代码 注意点:你写的类必须继续MiddlewareMixin from ...
- 贪心-最大相容区间-Maximum Number of Events That Can Be Attended
2020-02-16 16:24:19 问题描述: 问题求解: 看起来就像是sort + 贪心,但是具体如何做呢? 实际上本题是最大相容区间的变种题,在最大相容区间里,我们按照结束时间对interva ...
- 如何将一篇文章导入Endnote并将引用插入Word
Endnote作为一款专注管理文献引用的工具用起来还是很方便的,极大地简化了管理引用格式等相关工作,让我们能够把更多精力用在写文章本身. 今天就介绍一下如何将一篇我们看到的觉得有参考价值的文章导入wo ...
- linggle使用技巧
Linggle 搜索引擎是一个可用于英语写作的语法.句子工具,可帮助学习者分析更准确的英文写作建议,能够根据词性来推测短句和句子,可精准的分享出完整英文句子如何撰写. Linggle 是台湾学术团队研 ...
- Markdown 高阶语法
记录一些 Markdown 的高阶语法,想起来什么,再更新 分割线 两条分割线 *** *** 插入表格 Column Column Column Row Content Content | Colu ...
- AttributeError: module 'tensorflow.python.keras.backend' has no attribute 'get_graph'处理办法
原因:安装的tensorflow版本和keras版本不匹配,只需卸载keras,重新安装自己tensorflow对应的版本. Keras与tensorflow版本匹配查询网站
- 瀑布流vue-waterfall的高度设置
最近用vue做项目,用到了瀑布流vue-waterfall,其中遇到高度的设置问题,大概介绍下,希望可以帮到一些人 1.安装 npm install --save vue-waterfall 2.引入 ...
- Flutter 不可错过的学习资源
老孟导读:今天给大家分享一下我在学习Flutter的过程中整理的资料,这些文章或者开源项目都是精挑细选的,希望可以帮助到到家.另外相关资料会在Github一直更新,欢迎大家fork,如果喜欢的话给个小 ...
- Javascript/JQuery遇到的bug
这次遇到一个js内部文件报错的,找了下不是我们的代码问题.我突然想到了,我使用的Umeditor有个内置的jquery,然后我也把它加到我们的项目里面,但是我查看了我们的项目,是引用过一个jquery ...
- P1006 传纸条(二维、三维dp)
P1006 传纸条 输入输出样例 输入 #1 复制 3 3 0 3 9 2 8 5 5 7 0 输出 #1 复制 34 说明/提示 [限制] 对于 30% 的数据,1≤m,n≤10: 对于 100% ...