版权申明:本文为博主窗户(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的更多相关文章

  1. 将java对象转成json字符串

    如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...

  2. 将Model对象转换成json文本或者json二进制文件

    将Model对象转换成json文本或者json二进制文件 https://github.com/casatwy/AnyJson 注意:经过测试,不能够直接处理字典或者数组 主要源码的注释 AJTran ...

  3. 编写Python脚本把sqlAlchemy对象转换成dict的教程

    编写Python脚本把sqlAlchemy对象转换成dict的教程 在用sqlAlchemy写web应用的时候,经常会用json进行通信,跟json最接近的对象就是dict,有时候操作dict也会比操 ...

  4. Newtonsoft.Json 把对象转换成json字符串

    var resultJson = new { records = rowCount, page = pageindex, //总页数=(总页数+页大小-1)/页大小 total = (rowCount ...

  5. json 字符串转换成对象,对象转换成json字符串

    json   字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法:   [注意jquery版本问题] var str = '{"name":&qu ...

  6. DataTabel DataSet 对象 转换成json

    public class DataTableConvertJson    { #region dataTable转换成Json格式        /// <summary>         ...

  7. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  8. JSON对象转换成JSON字符串

    1.问题背景 有一个json对象,需要将其转换成json字符串 JSON.stringify(obj) 2.实现源码 <!DOCTYPE html PUBLIC "-//W3C//DT ...

  9. Gson把对象转成json格式的字符串

    近期在做一个java web service项目,须要用到jason,本人对java不是特别精通,于是開始搜索一些java平台的json类库. 发现了google的gson.由于之前对于protoco ...

随机推荐

  1. JSP+Servlet+C3P0+Mysql实现的网上蛋糕店

    本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/PositiveMumu/CakesShop/tree/master 这次分享一个蛋糕商场系统,还是很简单的系统.界 ...

  2. Python电影数据分析

    数据说明:MovieLens数据集,它包含来自于943个用户以及精选的1682部电影的100K个电影打分.每个用户至少为20部电影打分,数据类型user id | item id | rating | ...

  3. 03 串口发送端口Rs232之简单驱动1

    前言: 最近想实际做两个项目,认真学习怎么做一个系统,所以在看FPGA小梅哥2019的培训课程,发现他是从各个模块讲起,就是没有直接讲一个整体的系统,而是从一些模块开始,如串口发送.刚开始我想直接创造 ...

  4. HDU - 1005 Number Sequence 矩阵快速幂

    HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...

  5. 基于zookeeper实现分布式锁和基于redis实现分布所的区别

    1,实现方式不同 zookeeper实现分布式锁:通过创建一个临时节点,创建的成功节点的服务则抢占到分布式锁,可做业务逻辑.当业务逻辑完成,连接中断,节点消失,继续下一轮的锁的抢占. redis实现分 ...

  6. Tainted canvases may not be exported的问题解决

    项目里使用到用canvas生成海报,在toDataURL报了这个错误Tainted canvases may not be exported. 原因就在于使用了跨域的图片,所以说是被污染的画布.解决方 ...

  7. A 现代艺术

    时间限制 : - MS   空间限制 : 165536 KB  评测说明 : 1s 问题描述 何老板是一个现代派的艺术家.他在一块由n*n的方格构成的画布上作画.一开始,所有格子里的数字都是0.何老板 ...

  8. # CodeCraft-20 (Div. 2)

    CodeCraft-20 (Div. 2) A. Grade Allocation 思路 : 无脑水题 代码 #include<iostream> #include<algorith ...

  9. Redis新手的坑,无法连接、缺少类、没有密码

    阿西吧,自己太菜了,用SpringBoot调用Redis缓存的时候,出了各种问题,记录一下,大家别学我 本文有自己的经验,也有从其他博客整理来的零零散散的经验. 1.安装Redis 安装redis,一 ...

  10. Docker的MySQL镜像, 实行数据,配置信息,日志持久化

    Docker的MySQL8镜像, 实行数据持久化 使用Docker的MySQL8.0.17实例化一个容器之后需要对其进行数据持久化操作, 使用 docker docker run -p 7797:33 ...