一尘不染

使用JSON保留Python元组

json

我对此还有些陌生,因此我可能不知道所有常规术语:

使用JSON编码时是否可以保留Python元组?现在json.loads(json.dumps(tuple))给我一个清单。我不想将元组转换为列表,但是我想使用JSON。那么,有选择吗?

原因:我正在创建一个使用多维数组的应用程序,但并不总是相同的形状。我有一些使用递归来探测数组并将端点转换为字符串或整数的类方法。我最近意识到(基于递归的工作方式)我可以使用元组来防止对数组进行更深入的递归搜索(Python
rawks)。在我确定可以肯定不需要对数据结构进行任何更深入研究的情况下,这可能会派上用场。


阅读 341

收藏
2020-07-27

共1个答案

一尘不染

您可以编写一个高度专业的编码器和一个解码器挂钩:

import json

class MultiDimensionalArrayEncoder(json.JSONEncoder):
    def encode(self, obj):
        def hint_tuples(item):
            if isinstance(item, tuple):
                return {'__tuple__': True, 'items': item}
            if isinstance(item, list):
                return [hint_tuples(e) for e in item]
            if isinstance(item, dict):
                return {key: hint_tuples(value) for key, value in item.items()}
            else:
                return item

        return super(MultiDimensionalArrayEncoder, self).encode(hint_tuples(obj))

def hinted_tuple_hook(obj):
    if '__tuple__' in obj:
        return tuple(obj['items'])
    else:
        return obj


enc = MultiDimensionalArrayEncoder()
jsonstring =  enc.encode([1, 2, (3, 4), [5, 6, (7, 8)]])

print jsonstring

# [1, 2, {"items": [3, 4], "__tuple__": true}, [5, 6, {"items": [7, 8], "__tuple__": true}]]

print json.loads(jsonstring, object_hook=hinted_tuple_hook)

# [1, 2, (3, 4), [5, 6, (7, 8)]]
2020-07-27