2015-07-09 2 views
-1

Моя первоначальная проблема заключается в том, что я хочу разобрать URL.Values на общий тип (map [interface {}] interface {}) изменить/добавить некоторые значения, а затем преобразовать их в строку JSON и поместить ее в столбец JSON PostgreSQL.golang не может отразить карту [interface {}] interface {}

Я пробовал этот код, чтобы разобрать его, но content кажется пустым, тогда как err является ложным. request.URL.Query() печатает красивый объект карты.

v := reflect.ValueOf(request.URL.Query()) 
i := v.Interface() 
content, err := i.(map[interface{}]interface{}) 

// Do some operations 

jsonString, _ := json.Marshal(content) 

// Add to DB 

Почему это null? Также я думаю слишком общий?

ответ

3

content, err := i.(map[interface{}]interface{}), это не бросок, это утверждение типа. Вы говорите (утверждаете), что интерфейс имеет тип map[interface{}]interface{}, это не так. Это тип map[string][]string. Вы получаете null как значение, потому что оно терпит неудачу. Я очень сомневаюсь, что error неверно.

Вы считаете слишком общим? Конечно же. Я не могу придумать какую-либо причину, по которой тип коллекций должен измениться ... Приложите к нему то, что вы хотите, напишите его в свой db. Нет ничего препятствующего этому афайку?

+0

Каков правильный способ работы с JSON, которые действительно динамичны? – Thellimist

+2

@ Thellimist 'map [string] interface {}', вероятно, самый популярный способ. Лично я всегда избегал динамических форм unmarshalling. Я довольно уверен в том, что я не говорю «действительно динамично». Всегда есть схема, она может быть гибкой. Отражение никогда не нужно в вашем коде, только в фактическом unmarshaller (в этом случае encoding/json, но то же самое относится к другим библиотекам Go и других языков). Кроме того, если json является вариантом, я могу попробовать 'TypeA', затем' B', затем 'C', чтобы исчерпать возможные схемы, в худшем случае я бы это сделал. Избегайте моих ошибок с самого начала. – evanmcdonnal