mailru / easyjson

Fast JSON serializer for golang.
MIT License
4.46k stars 422 forks source link

Fix null key in map #396

Open SolidShake opened 5 months ago

SolidShake commented 5 months ago

В данный момент, если мы попытаемся замаршалить что-то такое, без кастомных маршаллеров

test := example.ExampleStruct{
    ExampleMap: map[example.ExampleKey]string{
        "":     "val1",
        "key2": "val2",
    },
}

то получим {"example_map":{"":"val1","key2":"val2"}}

Если в тип выше добавить кастомные маршаллеры

func (k ExampleKey) MarshalText() ([]byte, error) {
    return []byte(k), nil
}

То получим невалидный json {"example_map":{null:"val1","key2":"val2"}} И при попытке его обратно заанмаршалить получим ошибку: panic: parse error: expected string near offset 20 of 'example_map'

Это происходит из-за использовании функции RawText

func (w *Writer) RawText(data []byte, err error) {
    switch {
    case w.Error != nil:
        return
    case err != nil:
        w.Error = err
    case len(data) > 0:
        w.String(string(data))
    default:
        w.RawString("null")
    }
}

Предлагаю убрать возможность возвращения null для ключей мапы, т.к. это приводит к неочевидному поведению