query-string
query-string copied to clipboard
Default arrayFormat causes arrays of length 1 to be serialised the same as a string
The default arrayFormat
value of none
is problematic because arrays of length 1 are serialised to the same format as if the value was the string contained within the array.
For example:
qs.parse(qs.stringify({a: 'val'})); // {a: 'val'}
qs.parse(qs.stringify({a: ['val']})); // {a: 'val'} WRONG/UNEXPECTED
qs.parse(qs.stringify({a: ['val', 'val2']})); // {a: ['val', 'val2']}
Perhaps the default arrayFormat
should be changed to bracket
or index
, which do not have this problem. The none
option would make more sense IMO if it refused to stringify an array when stringifying, and ignored/crash for duplicate keys when parsing. I don't see how the comma
option can be made to handle arrays consistently.
While I agree with you it's not optimal, people have been using this for years without complaining, so it cannot be that big of an issue. Not sure it's worth doing a breaking change to change the default, but we should at least make the "catches" clearer in the docs.
// @zepod @rapzo @yaodingyd Mentioning you in case you have an opinion on this.
I think better documentation would be fine, this is not worth a code change.
I understand the importance of predictability and wouldn't condone at all any code breaking change.
I think we could improve the situation by supporting optionally defining the type of one or more keys. See: https://github.com/sindresorhus/query-string/issues/228#issuecomment-575197530