// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package gconv import ( "github.com/gogf/gf/internal/json" ) // SliceMap is alias of Maps. func SliceMap(i interface{}) []map[string]interface{} { return Maps(i) } // SliceMapDeep is alias of MapsDeep. func SliceMapDeep(i interface{}) []map[string]interface{} { return MapsDeep(i) } // SliceStruct is alias of Structs. func SliceStruct(params interface{}, pointer interface{}, mapping ...map[string]string) (err error) { return Structs(params, pointer, mapping...) } // SliceStructDeep is alias of StructsDeep. // Deprecated, use SliceStruct instead. func SliceStructDeep(params interface{}, pointer interface{}, mapping ...map[string]string) (err error) { return StructsDeep(params, pointer, mapping...) } // Maps converts to []map[string]interface{}. // Note that it automatically checks and converts json string to []map if is string/[]byte. func Maps(value interface{}, tags ...string) []map[string]interface{} { if value == nil { return nil } switch r := value.(type) { case string: list := make([]map[string]interface{}, 0) if len(r) > 0 && r[0] == '[' && r[len(r)-1] == ']' { if err := json.Unmarshal([]byte(r), &list); err != nil { return nil } return list } else { return nil } case []byte: list := make([]map[string]interface{}, 0) if len(r) > 0 && r[0] == '[' && r[len(r)-1] == ']' { if err := json.Unmarshal(r, &list); err != nil { return nil } return list } else { return nil } case []map[string]interface{}: return r default: array := Interfaces(value) if len(array) == 0 { return nil } list := make([]map[string]interface{}, len(array)) for k, v := range array { list[k] = Map(v, tags...) } return list } } // MapsDeep converts to []map[string]interface{} recursively. // // TODO completely implement the recursive converting for all types. func MapsDeep(value interface{}, tags ...string) []map[string]interface{} { if value == nil { return nil } switch r := value.(type) { case string: list := make([]map[string]interface{}, 0) if len(r) > 0 && r[0] == '[' && r[len(r)-1] == ']' { if err := json.Unmarshal([]byte(r), &list); err != nil { return nil } return list } else { return nil } case []byte: list := make([]map[string]interface{}, 0) if len(r) > 0 && r[0] == '[' && r[len(r)-1] == ']' { if err := json.Unmarshal(r, &list); err != nil { return nil } return list } else { return nil } case []map[string]interface{}: list := make([]map[string]interface{}, len(r)) for k, v := range r { list[k] = MapDeep(v, tags...) } return list default: array := Interfaces(value) if len(array) == 0 { return nil } list := make([]map[string]interface{}, len(array)) for k, v := range array { list[k] = MapDeep(v, tags...) } return list } }