This is done all the time in Elixir without fanfare, and you don’t even need to use a DSL. One just uses maps and lists that basically map one-to-one to JSON.
By the way, Elixir does have macros.
I agree it's nice when something as common today as JSON is built in to a language. But for something like Common Lisp, whose roots are now nearly 40 years old, the fact it can easily support JSON literals is nothing short of amazing.