Currently we have a solution where we in case of encoding redefine the Poison.Encoder protocol implementation for Map and for decoding do a recursive run though the map resulting from calling Poison.decode. It would be nice if it was something that could be build into the serializer using a simple hook as described above.
👍 I have exactly the same use-case. Elixir to JS and back. A hook like this would make life much easier.
Considering this for inclusion in 1.6.
Extractly what i searched! :) Would be amazing to see this implemented. The base of @joshprice looks already good!
Any update on this? I would love to have some basic support for this.
I think what people are asking here is for an external function to be called to transform the keys. The anonymous function would be up to library user to define and pass_in, thus we avoid having it built-into Poison.
would also be nice to have value transformations if possible... (for example decrypting an encrypted value)
I have a use case where the input json has keys in mixed cases, sometimes Latitude and sometimes latitude. At the moment I am manually lower casing keys using http://minhajuddin.com/2017/01/11/case-insensitive-key-retrieval-from-maps-in-elixir/ Would love to have this even if it provided a lower_case_keys transform
@minhajuddin be careful with that, as iterating all keys/values each time you need to access defeats the purpose of using a map over a keyword list. A large data set will be significantly slower to access this way. I would say that a better approach would be to modify that code to attempt to fetch latitude and then try Latitude. Even if you try various versions of the key that will scale better than Enum.find/2
@mgwidmann Good point. Creating a new map and then using lower case keys to access makes more sense performance wise.
The general advice is to fix data at the boundaries, when the data enters the rest of your system it should be in the correct state instead of trying to handle incorrect data everywhere in your system. That means that you should transform the map to lowercase after json decoding it instead of changing how you access the map.
@ericmj Makes total sense. That is why I am following this issue with interest. Adding this feature will help me transform the keys at the time of decoding. I have seen cowboy do this with http headers.