haskell / aeson

A fast Haskell JSON library
Other
1.25k stars 322 forks source link

Expose Data.Aeson.Encoding.Builder #644

Open alexbiehl opened 6 years ago

alexbiehl commented 6 years ago

At work we have a JSON schema which demands composite keys for objects of this form:

"<some integer>_<day>": ... 

Now, we used the venerable toKey (n, d) = Text.pack (show n ++ '_' ++ show d) but this turned out out to show up in our profiling and really was taking 10% of our overall runtime! So we went for some cruel hack:

     toKey (n ,d) = Encoding.unsafeToEncoding $
           Builder.char7 '"' <> Builder.intDec r <> Builder.char7 '_'
        <> Encoding.fromEncoding (Encoding.day d) <>  Builder.char7 '"'

Unfortunately this results in invalid JSON as Encoding.day is wrapped into quotes! It would be really neat if we could access the unsafe stuff from Data.Aeson.Encoding.Builder to use the Day encoding without quotes.

alexbiehl commented 6 years ago

(Or in general allow efficient encoding of this composite keys)

bergmark commented 6 years ago

Hey, sorry I missed this!

Exporting this in some way sounds good. I wonder if the module should be suffixed with Unsafe or Internal?

gridaphobe commented 6 years ago

It might be nice to expose the date/time encoders as a separate package like you did with the parsers. Perhaps iso8601-builder?