@@ -50,94 +50,3 @@ def _serialize(obj: Any, seen: set, depth: int) -> Any:
50
50
51
51
safe_data = _serialize (data , set (), 0 )
52
52
return json .dumps (safe_data , default = str )
53
-
54
-
55
- def filter_json_serializable (
56
- data : Any , max_depth : int = DEFAULT_MAX_RECURSE_DEPTH
57
- ) -> Any :
58
- """
59
- Recursively filter data to only include JSON serializable items.
60
- Non-serializable items are completely skipped (not included in the result).
61
- """
62
-
63
- def _is_json_serializable (obj : Any ) -> bool :
64
- """Test if an object is JSON serializable."""
65
- try :
66
- json .dumps (obj )
67
- return True
68
- except (TypeError , ValueError ):
69
- return False
70
-
71
- def _filter (obj : Any , seen : set , depth : int ) -> Any :
72
- # Check for maximum depth.
73
- if depth > max_depth :
74
- return None
75
-
76
- # Base-case: if it is a primitive, test if it's serializable
77
- if isinstance (obj , (str , int , float , bool , type (None ))):
78
- return obj if _is_json_serializable (obj ) else None
79
-
80
- # Check for circular reference.
81
- if id (obj ) in seen :
82
- return None
83
-
84
- seen .add (id (obj ))
85
-
86
- try :
87
- if isinstance (obj , dict ):
88
- result = {}
89
- for k , v in obj .items ():
90
- # Only include keys that are strings and values that are serializable
91
- if isinstance (k , str ):
92
- filtered_value = _filter (v , seen , depth + 1 )
93
- # Only add the key-value pair if the value is serializable
94
- if filtered_value is not None or v is None :
95
- if _is_json_serializable (filtered_value ):
96
- result [k ] = filtered_value
97
- seen .remove (id (obj ))
98
- return result
99
-
100
- elif isinstance (obj , list ):
101
- result = []
102
- for item in obj :
103
- filtered_item = _filter (item , seen , depth + 1 )
104
- # Only include items that are serializable
105
- if filtered_item is not None or item is None :
106
- if _is_json_serializable (filtered_item ):
107
- result .append (filtered_item )
108
- seen .remove (id (obj ))
109
- return result
110
-
111
- elif isinstance (obj , tuple ):
112
- filtered_items = []
113
- for item in obj :
114
- filtered_item = _filter (item , seen , depth + 1 )
115
- # Only include items that are serializable
116
- if filtered_item is not None or item is None :
117
- if _is_json_serializable (filtered_item ):
118
- filtered_items .append (filtered_item )
119
- seen .remove (id (obj ))
120
- return tuple (filtered_items )
121
-
122
- elif isinstance (obj , set ):
123
- filtered_items = []
124
- for item in obj :
125
- filtered_item = _filter (item , seen , depth + 1 )
126
- # Only include items that are serializable
127
- if filtered_item is not None or item is None :
128
- if _is_json_serializable (filtered_item ):
129
- filtered_items .append (filtered_item )
130
- seen .remove (id (obj ))
131
- return sorted (filtered_items )
132
-
133
- else :
134
- # Test if the object is directly serializable
135
- seen .remove (id (obj ))
136
- return obj if _is_json_serializable (obj ) else None
137
-
138
- except Exception :
139
- if id (obj ) in seen :
140
- seen .remove (id (obj ))
141
- return None
142
-
143
- return _filter (data , set (), 0 )
0 commit comments