/ / unmarshal genérico json em Go - json, generics, go

unmarshal genérico json em Go - json, generics, go

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 № 1

O 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:

  1. 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 como ID e Name para seus nomes de variáveis ​​dentro myStruct1.
  2. Seu conteúdo é inválido, JSON. O que você realmente quer é {"ID":"id1","Name":"myName"}.
  3. Você está passando object para parseJSON mas você está usando parsed em vez disso, não object. Faço parseJSON receber um *myStruct (em vez de um interface{}), e usar essa variável em vez de parsed quando desmarcar a string. Além disso, sempre lidar com o erro retorna, como err := json.Unmarshal(content, object)e verifique err.

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.