h2non / jsonpath-ng

Finally, a JSONPath implementation for Python that aims to be standard compliant. That's all. Enjoy!
Apache License 2.0
608 stars 88 forks source link

Traverse plain Python classes/objects as well as JSON dicts #185

Open athewsey opened 12 hours ago

athewsey commented 12 hours ago

Hi & thanks for your work sharing this library!

I have a use-case where I'd like to be able to fetch data from either a raw API response (in dicts, lists, and other JSON-native types), OR from an already-parsed Pydantic model (even better if arbitrary Python classes/objects supported too).

It seems from the Descendents.find implementation like jsonpath-ng explicitly does not support fetching data from plain Python objects (for example using getattr(datum.value, field) instead of datum.value[field]). Would it be possible to enable this?

It is fair that there are some potentially funky edge cases here, because you'd be able to retrieve properties & methods from native objects (For example $.num.real.real.real.real... on {"num": 13})... So maybe it'd be necessary to put the ability to traverse plain objects behind a configuration option in parse(), and leave it turned off by default? That'd still un-block our use-case.

athewsey commented 11 hours ago

For now my workaround to this is to use JSONPath on obj.model_dump() (since this Pydantic method supports recursively converting possibly-nested models to plain dicts)... Which is okay, but wouldn't work for any use-cases hoping to use other Python objects that don't have this interface.