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