Há um alguns perguntas sobre o tema , mas nenhum deles parecem cobrir meu caso, portanto, eu estou criando um novo.
Eu tenho JSON como o seguinte:
{"foo":{ "bar": "1", "baz": "2" }, "more": "text"}
Existe uma maneira de desempacotar a propriedade aninhada bar e atribuí-la diretamente a uma propriedade de estrutura sem criar uma estrutura aninhada?
A solução que estou adotando agora é a seguinte:
type Foo struct {
More String `json:"more"`
Foo struct {
Bar string `json:"bar"`
Baz string `json:"baz"`
} `json:"foo"`
// FooBar string `json:"foo.bar"`
}
Esta é uma versão simplificada, por favor, ignore o detalhamento. Como você pode ver, gostaria de analisar e atribuir o valor a
// FooBar string `json:"foo.bar"`
Já vi pessoas usando um mapa, mas não é o meu caso. Eu basicamente não me importo com o conteúdo de foo
(que é um objeto grande), exceto para alguns elementos específicos.
Qual é a abordagem correta neste caso? Não estou procurando por hacks estranhos, portanto, se esse é o caminho a percorrer, estou bem com isso.
Como o que Volker mencionou, structs aninhados são o caminho a percorrer. Mas se você realmente não quiser estruturas aninhadas, pode substituir a função UnmarshalJSON.
https://play.golang.org/p/dqn5UdqFfJt
Ignore o fato de que não estou retornando um erro adequado. Eu deixei isso de lado para simplificar.
ATUALIZAÇÃO: Recuperando corretamente o valor "mais".
fonte
Este é um exemplo de como desmarcar respostas JSON do servidor proxy sbserver da API Safebrowsing v4: https://play.golang.org/p/4rGB5da0Lt
fonte
Sim. Com gjson, tudo o que você precisa fazer agora é:
bar := gjson.Get(json, "foo.bar")
bar
pode ser uma propriedade de estrutura, se desejar. Além disso, sem mapas.fonte
fastjson.GetString(json, "foo", "bar")
E os campos anônimos? Não tenho certeza se isso constituirá uma "estrutura aninhada", mas é mais limpo do que ter uma declaração de estrutura aninhada. E se você quiser reutilizar o elemento aninhado em outro lugar?
fonte
Atribua os valores de aninhado
json
a struct até saber o tipo subjacente de chaves json: -fonte
Eu estava trabalhando em algo assim. Mas está trabalhando apenas com estruturas geradas a partir do proto. https://github.com/flowup-labs/grpc-utils
em seu proto
Então sua saída será
fonte
A combinação de map e struct permite o desempacotamento de objetos JSON aninhados em que a chave é dinâmica. => mapa [string]
Por exemplo: stock.json
Aplicativo Go
A chave dinâmica no hash é lidar com uma string e o objeto aninhado é representado por uma estrutura.
fonte