版权申明:本文为博主窗户(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. hdu3695 AC自动机优化

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3695/ 不加last指针的AC自动机会T,原因是他费了很多功夫在跳转上,而last指针是直接直到跳转的终止位置, ...

  2. hdu1078 dfs+dp(记忆化搜索)搜索一条递增路径,路径和最大,起点是(0,0)

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  3. hdu1728 逃离迷宫bfs

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/1728/ 关于广度优先搜索的第一篇题解.广度优先搜索,就是状态树的层次遍历,一层一层的搜索,直到搜索到目标状态为止 ...

  4. 题解 P5681 【面积【民间数据】】

    讲讲我的做法 分析题意 如果两人的面积一样大怎么办? 然后发现 输出仅一行一个字符串,若正方形面积大则输出 Alice,否则输出 Bob. 所以一样输\(Bob\) 算面积 \(Alice\)的面积就 ...

  5. 图-连通分量-DFS-并查集-695. 岛屿的最大面积

    2020-03-15 16:41:45 问题描述: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二 ...

  6. Windows下用Python你会几种copy文件的方法?

    1. [代码]1. os.system ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import os import temp ...

  7. 力软敏捷框架7.0.6 葡萄城报表升级到ar14版本

    忙了两天终于搞定升级到ar14版本,坑无数,终于算全部解决,在这里做一个小结. 1.第一步去掉框架中原本集成的ar13部分(吐槽一下应该是对12的集成). 首先去掉licenses.licx文件. 然 ...

  8. 常见SQL语句和SQL基础知识

    引自:http://blog.csdn.net/u012467492/article/details/46790205 SQL语句考察(一) 1.查询出每门课都大于80 分的学生姓名 name   k ...

  9. stm32:extern关键字

    参考:http://c.biancheng.net/view/404.html 1.在一个文件中: #include <stdio.h> int max(int x,int y); int ...

  10. Fiddler插件---将Mapi请求自动转为HTTPRunner测试用例(YAML格式)

    背景 继之前鼓捣出了Mapi解密插件之后,在团队内已经使用了三年之久,一跃成为团队最爱欢迎的测试工具之一(加个之一,低调谦虚一点). 随着团队推行HttpRunner搞接口自动化:编写和维护Case带 ...