easyjson icon indicating copy to clipboard operation
easyjson copied to clipboard

Fix null key in map

Open SolidShake opened this issue 1 year ago • 0 comments

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

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 для ключей мапы, т.к. это приводит к неочевидному поведению

SolidShake avatar Apr 19 '24 08:04 SolidShake