File size: 3,833 Bytes
02e90e4
 
 
 
 
 
 
 
 
 
da8d589
 
 
02e90e4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
da8d589
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
class JsonObject:
    def __init__(self, initial_dict=None):
        """
        Initialize the JsonObject with an optional initial dictionary.

        :param initial_dict: A dictionary to initialize the JsonObject.
        """
        # If no initial dictionary is provided, use an empty dictionary
        self._dict_obj = initial_dict if initial_dict is not None else {}

        if self._dict_obj is self:
            raise ValueError("JsonObject cannot be initialized with itself")

    def __getattr__(self, name):
        """
        Get an attribute value. If the attribute does not exist,
        look it up in the internal dictionary.

        :param name: The name of the attribute.
        :return: The value of the attribute.
        :raises AttributeError: If the attribute is not found in the dictionary.
        """
        try:
            return self._dict_obj[name]
        except KeyError:
            return None

    def __setattr__(self, name, value):
        """
        Set an attribute value. If the attribute name is '_dict_obj',
        set it directly as an instance attribute. Otherwise,
        store it in the internal dictionary.

        :param name: The name of the attribute.
        :param value: The value to set.
        """
        if name == "_dict_obj":
            super().__setattr__(name, value)
        else:
            self._dict_obj[name] = value

    def __delattr__(self, name):
        """
        Delete an attribute. If the attribute does not exist,
        look it up in the internal dictionary and remove it.

        :param name: The name of the attribute.
        :raises AttributeError: If the attribute is not found in the dictionary.
        """
        try:
            del self._dict_obj[name]
        except KeyError:
            return

    def __getitem__(self, key):
        """
        Get an item value from the internal dictionary.

        :param key: The key of the item.
        :return: The value of the item.
        :raises KeyError: If the key is not found in the dictionary.
        """
        if key not in self._dict_obj:
            return None
        return self._dict_obj[key]

    def __setitem__(self, key, value):
        """
        Set an item value in the internal dictionary.

        :param key: The key of the item.
        :param value: The value to set.
        """
        self._dict_obj[key] = value

    def __delitem__(self, key):
        """
        Delete an item from the internal dictionary.

        :param key: The key of the item.
        :raises KeyError: If the key is not found in the dictionary.
        """
        del self._dict_obj[key]

    def to_dict(self):
        """
        Convert the JsonObject back to a regular dictionary.

        :return: The internal dictionary.
        """
        return self._dict_obj

    def has_key(self, key):
        """
        Check if the key exists in the internal dictionary.

        :param key: The key to check.
        :return: True if the key exists, False otherwise.
        """
        return key in self._dict_obj

    def keys(self):
        """
        Get a list of keys in the internal dictionary.

        :return: A list of keys.
        """
        return self._dict_obj.keys()

    def values(self):
        """
        Get a list of values in the internal dictionary.

        :return: A list of values.
        """
        return self._dict_obj.values()

    def clone(self):
        """
        Clone the JsonObject.

        :return: A new JsonObject with the same internal dictionary.
        """
        return JsonObject(self._dict_obj.copy())

    def merge(self, other):
        """
        Merge the internal dictionary with another dictionary.

        :param other: The other dictionary to merge.
        """
        self._dict_obj.update(other)