Как мне сериализовать карту типа [string] refle.Value? - PullRequest
0 голосов
/ 24 сентября 2018

Я пытался понять, как заставить это работать, и я застрял.

У меня есть объект, который выглядит так:

type PropSet map[string]*Prop

type Prop struct {
    val reflect.Value
}

, и мне нужногенерировать JSON-представление всех пар ключ-значение, которые оно содержит.Я читал посты на SO, в которых рассказывалось о том, как упорядочить более обыденные типы, но я не смог понять, что делать с типом отражать. Значение.Я думаю, что я должен быть в состоянии сделать что-то простое, как это:

func (p Prop) MarshalJSON() ([]byte, error) {
    return json.Marshal(p.val.Value().Interface())
}

... но это просто не работает.Любые предложения?

Дополнительное примечание: я не писал структуру данных, но причина, по которой я думаю, что она использует отражение. Значение для карты состоит в том, что ожидаемые значения могут быть целыми числами,float, string и т. д. Так что это по сути необходимо сделать какой-то вывод типа с базовым интерфейсом, чтобы выяснить возвращаемый результат.

1 Ответ

0 голосов
/ 24 сентября 2018

Вы почти у цели: reflect.Value сам по себе не имеет Value метода приемника и не нуждается в нем.Изменение вашей реализации MarshalJSON на следующие работы:

func (p Prop) MarshalJSON() ([]byte, error) {
    return json.Marshal(p.val.Interface())
}

(т.е. удаление .Value() из цепочки вызовов функций).

Ссылка на игровую площадку

(мне здесь не нравится использование reflect - решения, основанные на рефлексии, редко бывают ясными и понятными, но кажется, что вы не можете изменить структуру данных восходящего потока, кроме того, что решили не использовать ее.)

...