introdução
Esse problema ocorria ao analisar um arquivo de configuração json. Depois de solucionar o problema por um longo tempo, finalmente resolvi esse estranho problema com o Gou Xun.
texto
Na verdade, esse problema não é difícil, porque Golang vem com o pacote json, então o que temos que fazer é adicionar as tags correspondentes à estrutura que precisa ser analisada, mas pode haver alguns bugs ocultos sem nenhum erro.
Encontrei dois problemas no total. O primeiro é mais fácil de resolver e a maioria das soluções online descreve o primeiro problema; mas o segundo problema é muito estranho, porque há problemas no projeto, escrevi Um código de teste não reproduzir com sucesso.
A primeira solução: os campos correspondentes da estrutura que precisam ser analisados devem ser capitalizados .
Vejamos primeiro um trecho de código:
---test.json
{
"page": 1,
"fruits": ["apple", "peach"]
}
---test_json.go
type response struct {
number int
Page int `json:page`
fruits []string `json:fruits`
}
func main(){
data, _ := io.ReadFile("test.json")
res := response{
}
json.Unmarshal(data, &res)
fmt.Println(res)
}
ouput:
{
0 1 []}
A gente percebe que existe um problema quando a primeira letra é minúscula, e a solução é muito fácil, ou seja, você precisa mudar o início do campo para maiúsculo. Claro, isso tem desvantagens, pois os campos que geralmente precisam a serem lidos a partir do arquivo de configuração geralmente estão relacionados à configuração Relacionada, e geralmente devem ser configurados como privados, C ++ pode ser resolvido muito bem, essa pode ser a razão pela qual go não é tão livre quanto C ++, claro, isso pode também é a razão pela qual C ++ não tem uma biblioteca json como go.
A segunda solução: análise JSON de Goland necessário adicionar aspas duplas ou não adicionar aspas duplas O nome não pode conter sublinhados, ou seja._
.
Ou seja, a estrutura acima deve ser escrita assim:
type response struct {
number int
Page int `json:"page"`
fruits []string `json:"fruits"`
}
É isso. Embora o código de teste possa analisar corretamente a fatia sem aspas duplas, há um problema com a estrutura do projeto. Extraí o campo json da estrutura do projeto para reproduzi-lo. Errado:
---test.json
{
"servers_address": ["localhost:8901","localhost:8902"],
"myport" : ":8900",
"maxreries" : 13,
"timeout_entry" : 200
}
---test_json.go
type response struct {
Maxreries int `json:maxreries`
ServersAddress []string `json:servers_address`
MyPort string `json:myport`
TimeOutEntry int `json:timeout_entry`
}
func main(){
data, _ := io.ReadFile("test.json")
res := response{
}
json.Unmarshal(data, &res)
fmt.Println(res)
}
ouput:
{
13 [] :8900 0}
Podemos ver que a análise falhou ServersAddress
e a TimeOutEntry
análise falhou. Esta não é a falha da análise de fatias. Também há um problema com o int. Vamos adicionar aspas duplas para ver:
ouput:
{
13 [localhost:8901 localhost:8902] :8900 200}
Podemos ver que a análise foi bem-sucedida.
Então, por que às vezes ele consegue analisar sem as aspas duplas, mas às vezes não? Como não é a falha de analisar a fatia, também ocorre um erro ao analisar o int.
Observando os dois campos problemáticos, descobrimos que eles têm uma coisa em comum, ou seja, eles estão incluídos na tag json _
. Vamos remover a execução e dar uma olhada:
{
13 [localhost:8901 localhost:8902] :8900 200}
Verifique o erro! Ou seja, a análise json de Golang não pode analisar _
os campos no nome quando a tag json da estrutura não está entre aspas duplas !
Estima-se que esse problema seja extremamente implícito e não esteja descrito nos documentos oficiais. Não há nenhum artigo descrevendo esse problema na Internet antes deste. Espero que a leitura deste artigo possa ajudá-lo a resolver esse problema confuso.
referência:
- 博 文 《Vá por exemplo: JSON》
- Documento " func Unmarshal "