Eu sou um novo programador Go (de Java) e gostaria de reproduzir uma maneira genérica que é esay para usar em Java.
Eu quero criar alguma função que me permita fazer um Unmarshal em uma string JSON para evitar duplicidade de código.
Este é o meu código atual que não está funcionando:
type myStruct1 struct {
id string
name string
}
func (obj myStruct1) toString() string {
var result bytes.Buffer
result.WriteString("id : ")
result.WriteString(obj.id)
result.WriteString("n")
result.WriteString("name : ")
result.WriteString(obj.name)
return result.String()
}
func main() {
content := `{id:"id1",name="myName"}`
object := myStruct1{}
parseJSON(content, object)
fmt.Println(object.toString())
}
func parseJSON(content string, object interface{}) {
var parsed interface{}
json.Unmarshal([]byte(content), &parsed)
}
Este código, em execução, me retorna isso:
id :
name :
Você tem alguma ideia ?
obrigado
Respostas:
2 para resposta № 1O problema é que você quer escrever para um tipo genérico? Você provavelmente quer um mapa de strings. Isso funciona com BSON de qualquer maneira:
var anyJson map[string]interface{}
json.Unmarshal(bytes, &anyJson)
Você poderá acessar os campos da seguinte forma:
anyJson["id"].(string)
Não se esqueça de digitar seus valores, e eles devo ser o tipo correto ou eles "vão entrar em pânico. (Você pode ler mais sobre as asserções de tipo no site do golang)
0 para resposta № 2
Você precisa exportar seus campos:
type myStruct1 struct {
Id string
Name string
}
Vejo Identificadores exportados da documentação.
0 para resposta № 3
Existem algumas alterações que você precisa fazer no seu código para que ele funcione:
- A função
json.Unmarshal
só pode definir variáveis dentro de sua estrutura que são exportadas, isto é, que começam com letras maiúsculas. Use algo comoID
eName
para seus nomes de variáveis dentromyStruct1
. - Seu conteúdo é inválido, JSON. O que você realmente quer é
{"ID":"id1","Name":"myName"}
. - Você está passando
object
paraparseJSON
mas você está usandoparsed
em vez disso, nãoobject
. FaçoparseJSON
receber um*myStruct
(em vez de uminterface{}
), e usar essa variável em vez deparsed
quando desmarcar a string. Além disso, sempre lidar com o erro retorna, comoerr := json.Unmarshal(content, object)
e verifiqueerr
.
Eu sugiro que você faça o Tour de Golang ;)
0 para a resposta № 4
Unmarshal irá apenas definir campos exportados da estrutura.
O que significa que você precisa modificar a estrutura do json para usar maiúsculas:
type myStruct1 struct {
Id string
Name string
}
A razão por trás disso é que a biblioteca json não tem a capacidade de exibir campos usando reflect, a menos que eles sejam exportados.