iancoleman / orderedmap

orderedmap is a golang map where the keys keep the order that they're added. It can be de/serialized from/to JSON. It's based closely on the python collections.OrderedDict.
MIT License
360 stars 55 forks source link

MarshalJSON outputs too many newlines #25

Open bojanz opened 3 years ago

bojanz commented 3 years ago

Current implementation:

        // add key
        if err := encoder.Encode(k); err != nil {
            return nil, err
        }
        buf.WriteByte(':')
        // add value
        if err := encoder.Encode(o.values[k]); err != nil {
            return nil, err
        }

encoder.Encode will always add a newline:

    // Terminate each value with a newline.
    // This makes the output look a little nicer
    // when debugging, and some kind of space
    // is required if the encoded value was a number,
    // so that the reader knows there aren't more
    // digits coming.
    e.WriteByte('\n')

So we always get a newline after the key and after the value:

{"id"
:"123456"
,"status"
:"active"

This could be avoided by using json.Marshal(), but json.Marshal doesn't support turning off HTML encoding. So in order to preserve BC, we need to have a helper that will strip the last byte from the encoded output.