2015-07-09 4 views
0

Я получаю неизвестную JSON от клиента, и я анализирую интерфейс какСделайте все свойства в нижнем регистре или в верхнем регистре, используя отражающие?

var f interface{} 
err := json.Unmarshal(b, &f) 

Как сделать все ключи в F, чтобы быть ниже клавиши? Мне нужно сохранить этот f в mongo, и мне нужно сделать некоторые запросы, но я хочу избежать ошибки, если кто-то отправит прописные буквы тем же json.

ответ

2

Вот один из способов сделать это:

var f interface{} 
err := json.Unmarshal(b, &f) 
f = lower(f) 

где низшее:

func lower(f interface{}) interface{} { 
    switch f := f.(type) { 
    case []interface{}: 
    for i := range f { 
     f[i] = lower(f[i]) 
    } 
    return f 
    case map[string]interface{}: 
    lf := make(map[string]interface{}, len(f)) 
    for k, v := range f { 
     lf[strings.ToLower(k)] = v 
    } 
    return lf 
    default: 
    return f 
    } 
} 

Функция lower является рекурсивным для обработки ключей преобразования вложенных объектов JSON.

playground

Если вы знаете, что вы работаете с объектом без вложенности, то вы можете встраивать случай карту от lower:

var f map[string]interface{} 
err := json.Unmarshal(b, &f) 
lf := make(map[string]interface{}, len(f)) 
for k, v := range f { 
    lf[strings.ToLower(k)] = v 
} 
f = lf 
3

Это будет map[string]interface{}, поэтому перейдите по нему и просто преобразуйте ключи в нижний регистр.

var f map[string]interface{} 
... 

converted := make(map[string]interface{}, len(f)) 
for k, v := range f { 
    converted[strings.ToLower(k)] = v 
} 
Смежные вопросы