首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONEncoder不处理列表

JSONEncoder不处理列表
EN

Stack Overflow用户
提问于 2016-10-05 21:16:37
回答 1查看 385关注 0票数 1

我有一个嵌套得很深的数据结构,包含大量的列表。我想要清点列表,而不是显示所有内容。

代码语言:javascript
复制
class SummaryJSONEncoder(json.JSONEncoder):
    """
    Simple extension to JSON encoder to handle date or datetime objects
    """
    def default(self, obj):
        func = inspect.currentframe().f_code
        logger.info("%s in %s:%i" % ( 
            func.co_name, 
            func.co_filename, 
            func.co_firstlineno
        ))
        logger.info('default %s', type(obj))
        if isinstance(obj, (datetime.datetime, datetime.date,)):
            return obj.isoformat()
        if isinstance(obj, (list, tuple, set,)):
            return "count(%s)" % len(obj)
        else:
            logger.info('Falling back for %s', type(obj))
            return super(SummaryJSONEncoder, self).default(obj)
    def encode(self, obj):
        func = inspect.currentframe().f_code
        logger.info("%s in %s:%i" % ( 
            func.co_name, 
            func.co_filename, 
            func.co_firstlineno
        ))
        return super(SummaryJSONEncoder, self).encode(obj)

这些集合似乎编码正确,但是列表和元组不会屈从于我的意愿。

代码语言:javascript
复制
 >>> json.dumps({'hello': set([]), 'world': [1,2,3], 'snot': (1,2,3,), 'time': datetime.datetime.now()}, indent=4, cls=SummaryJSONEncoder)
2016-10-05 14:07:42,786 (9296) __main__ INFO - encode in <pyshell#56>:20
2016-10-05 14:07:42,789 (9296) __main__ INFO - default in <pyshell#56>:5
2016-10-05 14:07:42,792 (9296) __main__ INFO - default <type 'set'>
2016-10-05 14:07:42,793 (9296) __main__ INFO - default in <pyshell#56>:5
2016-10-05 14:07:42,796 (9296) __main__ INFO - default <type 'datetime.datetime'>
'{\n    "world": [\n        1, \n        2, \n        3\n    ], \n    "hello": "count(0)", \n    "snot": [\n        1, \n        2, \n        3\n    ], \n    "time": "2016-10-05T14:07:42.786000"\n}'
>>>

我不知道,但看起来列表和元组是在其他地方处理的,而不是传递给默认方法。以前有人需要这样做吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-05 21:52:19

这似乎行得通

代码语言:javascript
复制
class SummaryJSONEncoder(json.JSONEncoder):
"""
Simple extension to JSON encoder to handle date or datetime objects
"""
def default(self, obj):
    if isinstance(obj, (datetime.datetime, datetime.date,)):
        return obj.isoformat()
    if isinstance(obj, (list, tuple, set,)):
        return "count(%s)" % len(obj)
    else:
        return super(SummaryJSONEncoder, self).default(obj)
def _iterencode_list(self, obj, x):
    if isinstance(obj, (list, tuple, set,)):
        return self.default(obj)
    return super(SummaryJSONEncoder, self)._iterencode_list(obj, x)

代码跟踪是。

代码语言:javascript
复制
json.dumps({'hello': set([]), 'world': [1,2,3], 'snot': (1,2,3,), 'time': datetime.datetime.now()}, indent=4, cls=SummaryJSONEncoder)
2016-10-05 14:50:10,785 (9296) __main__ INFO - default in <pyshell#73>:5
2016-10-05 14:50:10,788 (9296) __main__ INFO - default <type 'list'>
2016-10-05 14:50:10,792 (9296) __main__ INFO - default in <pyshell#73>:5
2016-10-05 14:50:10,796 (9296) __main__ INFO - default <type 'set'>
2016-10-05 14:50:10,799 (9296) __main__ INFO - default in <pyshell#73>:5
2016-10-05 14:50:10,802 (9296) __main__ INFO - default <type 'tuple'>
2016-10-05 14:50:10,806 (9296) __main__ INFO - default in <pyshell#73>:5
2016-10-05 14:50:10,811 (9296) __main__ INFO - default <type 'datetime.datetime'>
'{\n    "world": count(3), \n    "hello": "count(0)", \n    "snot": count(3), \n    "time": "2016-10-05T14:50:10.785000"\n}'

我希望这对某些人有帮助:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39875038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档