Resolução de problemas: o pacote json de Golang falhou ao analisar os campos

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 ServersAddresse a TimeOutEntryaná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:

Acho que você gosta

Origin blog.csdn.net/weixin_43705457/article/details/109191762
Recomendado
Clasificación