Decodifique um mapa em uma estrutura.
Explore a documentação »
Report Bug
·
Request Feature
Índice
Sobre o Projeto
Structmap é uma ferramenta que te permite preencher os valores de uma estrutura struct
tendo como base um mapa map[string]interface{}
.
Começando
Para usar o structmap basta seguir os seguintes passos.
-
Instale como uma dependência:
go get github.com/amulets/structmap
-
Crie uma instầncia do structmap
:
sm := structmap.New()
-
Adicione os comportamentos desejados:
/**
Única regra do structmap é que o primeiro comportamento
precisa ser a descoberta de nome, caso não tenha,
é preciso adicionar o name.Noop
*/
sm.AddBehavior(name.Noop)
-
Faça o decode do mapa na estrutura:
//Sua estrutura
type Person struct {
Name string
Age int
}
// Declaração da estrutura e do mapa
person := Person{}
data := map[string]interface{}{
"Name":"Joselito",
"Age": 100,
}
// Decode passando as informações do mapa para a estrutura
err := sm.Decode(data,&person)
-
Pegue os valores pela estrutura:
fmt.Println(person.Name)
//Out: Joselito
Veja o código completo aqui
Uso
1. Definindo o nome(key) do campo
1.1 Tag
Código de exemplo
type Person struct {
Name string `structmap:"my_name"`
}
...
data := map[string]interface{}{
"my_name": "myName",
"name": "Joselito",
}
...
sm.AddBehavior(name.FromTag("structmap"))
//Out: {Name:myName}
1.2 Snake case
Código de exemplo ou veja outros exemplo aqui.
type WordCase struct {
SnakeCase string //-> snake_case
}
...
data := map[string]interface{}{
"snake_case": "With Snake",
"SnakeCase": "Without snake",
}
...
sm.AddBehavior(name.FromSnake)
//Out: {SnakeCase:With Snake}
1.3 Discovery
Código de exemplo
type Person struct {
FirstName string `bson:"first_name"`
LastName string `json:"last_name"`
Age int
}
...
data := map[string]interface{}{
"first_name": "Joselito",
"last_name": "Otilesoj",
"age":100,
}
...
sm.AddBehavior(name.Discovery(
name.FromTag("bson"), //Pega o first_name
name.FromTag("json"), //Pega o last_name
name.FromSnake, //Pega o age
))
//Out: {FirstName:Joselito LastName:Otilesoj Age:100}
2. Definindo as flags
2.1 Required
Código de exemplo
type Person struct {
FirstName string `structmap:",required"`
}
...
data := map[string]interface{}{}
...
sm.AddBehavior(flag.Required("structmap"))
//Out: error -> field FirstName is required
2.2 NoEmbedded
Código de exemplo
type Person struct {
FirstName string
}
type Employee struct {
Person `structmap:",noembedded"`
}
...
data := map[string]interface{}{
"Person":map[string]interface{}{
"FirstName":"myName",
},
"FirstName":"Joselito",
}
...
sm.AddBehavior(flag.NoEmbedded("structmap"))
//Out: {Person:{FirstName:myName}}
3. Definindo as conversões
Código de exemplo
type Person struct {
FirstName string
Age int
}
type Employee struct {
Person
}
...
data := map[string]interface{}{
"FirstName":"Joselito",
"Age": "100", //A string será convertida para int
}
...
sm.AddBehavior(cast.ToType)
//Out: {Person:{FirstName:Joselito Age:100}}
Licença
Distribuído sob a licença MIT. Veja LICENSE
para mais informações.
Projetos similares