How toUse serializers with JSON.stringify and JSON.parse
If you are working with an API which expects and returns keys without using camelCase, e.g if you it uses snake_case, you can use JSON.stringify and JSON.parse to serialize it easily
Serialization
Let's see how to serialize an object to a string and change the keys to snake_case.
import { underscore } from "inflected"; function serialize<Input>(input: Input): string { return JSON.stringify(input, (_: string, value: unknown) => { // first we need to ensure the value is an object // and it's not an array (the typeof an array is object) // and it's not null (the typeof null is object) if (typeof value === "object" && !Array.isArray(value) && value !== null) { // we transform the object to an array with the shape [[key, value]] let entries = Object.entries(value).map((entry) => [ underscore(entry[0]), entry[1], ]); // we get the entries and transform back to an object return Object.fromEntries(entries); } return value; }); }
Now this serialize
function will receive any value that JSON.stringify
could have received and apply our replacer
function to transform the keys of the objects (and only objects) to snake_case
, to do the transformation I'm using the Inflected package but anything will work.
De-Serialization (aka parsing)
Let's see now how we could receive a JSON string with keys not using camelCase and transform them to an object with the keys in the expected case.
import { camelize } from "inflected"; function parse<Output>(input: string): Output { return JSON.parse(input, (_key, value: unknown) => { // first we need to ensure the value is an object // and it's not an array (the typeof an array is object) // and it's not null (the typeof null is object) if (typeof value === "object" && !Array.isArray(value) && value !== null) { // we transform the object to an array with the shape [[key, value]] let entries = Object.entries(value).map((entry) => [ camelize(entry[0], false), entry[1], ]); // we get the entries and transform back to an object return Object.fromEntries(entries); } return value; }); }
As you can see, the process is the same as the one used in serialize
but instead of transforming with the underscore
function we use camelize
, the false
as second argument is to use camelCase and not PascalCase which is the default of Inflected.