将json数组解码为冻结集

2024-04-29 14:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套的json数组,我想将数组解码为冻结集而不是列表。你知道吗

import json
class FrozensetDecoder(json.JSONDecoder): 
    def default(self, obj): 
        print(obj) 
        if isinstance(obj, list): 
            return frozenset(obj) 
        return obj 
    array = list = default 


In [8]: json.loads('[1,[2],3]', cls=FrozensetDecoder)                                                                                                                                                                                                                                                  
Out[8]: [1, [2], 3]

但我想

frozenset({1, frozenset({2}), 3})

Tags: importselfjsonobjdefault列表returndef
1条回答
网友
1楼 · 发布于 2024-04-29 14:23:15

我不熟悉将arraylist重新定义为default函数的方法。你知道吗

下面是一些代码,可以满足您的需要:

import json
from json import scanner


class MyDecoder(json.JSONDecoder):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # set up an alternative function for parsing arrays
        self.previous_parse_array = self.parse_array
        self.parse_array = self.json_array_frozenset
        # ensure that the replaced function gets used
        self.scan_once = scanner.py_make_scanner(self)

    def json_array_frozenset(self, s_and_end, scan_once, **kwargs):
        # call the parse_array that would have been used previously
        values, end = self.previous_parse_array(s_and_end, scan_once, **kwargs)
        # return the same result, but turn the `values` into a frozenset
        return frozenset(values), end


data = json.loads('[1,[2],3]', cls=MyDecoder)
print(data)

注意,结果将是frozenset({1, 3, frozenset({2})}),而不是frozenset({1, frozenset({2}), 3}),但是由于集合是无序的,所以这不重要。你知道吗

相关问题 更多 >