You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Go语言RedisConfig JSON解析失败求助(新手入门问题)

问题排查与修正方案

刚学Go没几天就尝试JSON解析到结构体,已经很棒啦!我帮你梳理下代码里的几个关键问题,这些就是导致解析失败的核心原因:

1. JSON字符串本身的语法错误

你的JSON文本存在语法硬伤,这是解析失败的首要原因:

  • prod节点下的pod_host值没有闭合双引号:
    "pod_host":"f.com, 
    
    必须修正为:
    "pod_host":"f.com", 
    
  • 另外还有两个业务逻辑上的小问题(不影响JSON语法,但不符合实际场景):
    • devport63713219远超常规端口范围(0-65535),大概率是笔误
    • stagehost"123.1.1."是不合法的IP格式,建议修正

2. Go代码的调用错误

json.Unmarshal的使用有两个关键错误:

  • 参数类型不匹配:第一个参数需要是[]byte类型,你直接传入了字符串jsonFile,得转换成[]byte(jsonFile)才能用
  • 未传入指针:第二个参数必须是指针类型,否则json.Unmarshal没法把解析后的数据写入结构体,要传&RedisConfig{}而非RedisConfig{}

3. 缺失错误检查

你没对json.Unmarshal返回的err做检查,这是调试这类问题的黄金技巧——只要打印错误信息,就能快速定位JSON语法或类型匹配的问题。

修正后的完整代码

package main

import (
	"encoding/json"
	"fmt"
)

type RedisConfig struct {
	Dev struct {
		Host     string `json:"host"`
		Port     int    `json:"port"`
		PodHost  string `json:"pod_host"`
		PodPort  int    `json:"pod_port"`
	} `json:"dev"`
	Stage struct {
		Host     string `json:"host"`
		Port     int    `json:"port"`
		PodHost  string `json:"pod_host"`
		PodPort  int    `json:"pod_port"`
	} `json:"stage"`
	Prod struct {
		Host     string `json:"host"`
		Port     int    `json:"port"`
		PodHost  string `json:"pod_host"`
		PodPort  int    `json:"pod_port"`
	} `json:"prod"`
}

func main() {
	var jsonFile = `{ 
    "dev": { 
        "host": "127.0.0.1", 
        "port": 6379, 
        "pod_host":"127.0.0.1", 
        "pod_port":131 
    }, 
    "stage": { 
        "host": "123.1.1.1", 
        "port": 6379, 
        "pod_host":"21321321", 
        "pod_port":6379 
    }, 
    "prod": { 
        "host": "21321321321", 
        "port": 6379, 
        "pod_host":"f.com", 
        "pod_port":6379 
    } 
}`

	var config RedisConfig
	_, err := json.Unmarshal([]byte(jsonFile), &config)
	if err != nil {
		fmt.Printf("JSON解析失败: %v\n", err)
		return
	}
	fmt.Printf("解析成功,Dev配置: %+v\n", config.Dev)
	fmt.Printf("解析成功,Stage配置: %+v\n", config.Stage)
	fmt.Printf("解析成功,Prod配置: %+v\n", config.Prod)
}

调试小技巧

以后遇到JSON解析问题,第一步就打印err的具体信息,Go的encoding/json会给出非常明确的提示:

  • 如果是JSON语法错误,会告诉你具体的行号和错误位置
  • 如果是类型不匹配,会指明哪个字段无法转换

内容的提问来源于stack exchange,提问作者Mayank Sharma

火山引擎 最新活动