@@ -25,6 +25,25 @@ class _String:
2525 def __init__ (self , value ):
2626 self .value = value
2727
28+ def _resolver (input , lazy , parsed ):
29+ ignore = {}
30+
31+ def resolver (output ):
32+ keys = _array_keys (output ) if _is_array (output ) else _object_keys (output ) if _is_object (output ) else []
33+ for key in keys :
34+ value = output [key ]
35+ if isinstance (value , _String ):
36+ tmp = input [int (value .value )]
37+ if (_is_array (tmp ) or _is_object (tmp )) and tmp not in parsed :
38+ parsed .append (tmp )
39+ output [key ] = ignore
40+ lazy .append ([output , key , tmp ])
41+ else :
42+ output [key ] = tmp
43+
44+ return output
45+
46+ return resolver
2847
2948def _array_keys (value ):
3049 keys = []
@@ -56,24 +75,6 @@ def _index(known, input, value):
5675 known .value .append (index )
5776 return index
5877
59- def _loop (keys , input , known , output ):
60- for key in keys :
61- value = output [key ]
62- if isinstance (value , _String ):
63- _ref (key , input [int (value .value )], input , known , output )
64-
65- return output
66-
67- def _ref (key , value , input , known , output ):
68- if _is_array (value ) and value not in known :
69- known .append (value )
70- value = _loop (_array_keys (value ), input , known , value )
71- elif _is_object (value ) and value not in known :
72- known .append (value )
73- value = _loop (_object_keys (value ), input , known , value )
74-
75- output [key ] = value
76-
7778def _relate (known , input , value ):
7879 if _is_string (value ) or _is_array (value ) or _is_object (value ):
7980 try :
@@ -128,12 +129,16 @@ def parse(value, *args, **kwargs):
128129 input .append (value )
129130
130131 value = input [0 ]
132+ lazy = []
133+ revive = _resolver (input , lazy , [value ])
131134
132- if _is_array (value ):
133- return _loop (_array_keys (value ), input , [value ], value )
135+ value = revive (value )
134136
135- if _is_object (value ):
136- return _loop (_object_keys (value ), input , [value ], value )
137+ i = 0
138+ while i < len (lazy ):
139+ o , k , r = lazy [i ]
140+ i += 1
141+ o [k ] = revive (r )
137142
138143 return value
139144
0 commit comments