JSON.stringify and symbols

# Jason Orendorff (10 years ago)

As specified in the latest draft:

  1. JSON.stringify(symbol) returns undefined.

  2. JSON.stringify([symbol]) returns "[null]".

  3. JSON.stringify(object) skips any symbol-keyed properties on the object.

So far, so good, I guess. A little wonky maybe, but JSON doesn't have symbols, so sure.

This struck me as funny though:

4. JSON.stringify(object) also skips symbol-valued properties.

That is, JSON.stringify({"x": Symbol()}) == "{}". I don't know that there's anything more useful it should be doing instead. Thoughts?

# Mark S. Miller (10 years ago)

JSON.stringify also skips function-valued properties, which seems even more weird. I think this is fine as long as it can be overridden by replacers and resolvers.

# Frankie Bagnardi (10 years ago)

It also skips explicit undefined values. Basically, if there's no good JSON representation of something, it pretends it doesn't exist.

You can also get this behavior by doing obj.toJSON = () => undefined example fiddle

In all of those cases symbols behave as if they were the value undefined, or an object with a toJSON which returns undefined.