uranusjr opened a new issue, #28741:
URL: https://github.com/apache/airflow/issues/28741

   ### Apache Airflow version
   
   main (development)
   
   ### What happened
   
   ```pycon
   >>> from airflow.utils.json import XComEncoder
   >>> XComEncoder().encode(set())
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/opt/airflow/airflow/utils/json.py", line 91, in encode
       return super().encode(o)
     File "/usr/local/lib/python3.7/json/encoder.py", line 199, in encode
       chunks = self.iterencode(o, _one_shot=True)
     File "/usr/local/lib/python3.7/json/encoder.py", line 257, in iterencode
       return _iterencode(o, 0)
     File "/opt/airflow/airflow/utils/json.py", line 82, in default
       return serialize(o)
     File "/opt/airflow/airflow/serialization/serde.py", line 97, in serialize
       if isinstance(o, _primitives):
   RecursionError: maximum recursion depth exceeded in __instancecheck__
   ```
   
   ### What you think should happen instead
   
   The encoder should correctly encode a value, or raise TypeError if it is not 
encodable.
   
   ### How to reproduce
   
   Simply use `XComEncoder` to encode anything that’s not encodable by the 
built-in JSONEncoder (i.e. something that’d go through the custom `default` 
hook).
   
   ### Operating System
   
   Any
   
   ### Versions of Apache Airflow Providers
   
   Irrelevant
   
   ### Deployment
   
   Official Apache Airflow Helm Chart
   
   ### Deployment details
   
   _No response_
   
   ### Anything else
   
   The problem here is because `serialize` does not guarantee to return a 
JSON-serializable object. So when `default` receives an set, it returns a set, 
and the encoder would try to serialize that set again, calling default, and 
eventually the stack explodes.
   
   The simplest solution would be to add an additional flag to `serialize` so 
it can return a JSON-compatible type if requested.
   
   ### Are you willing to submit PR?
   
   - [X] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [X] I agree to follow this project's [Code of 
Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to