惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
博客园 - 司徒正美
博客园 - 三生石上(FineUI控件)
博客园_首页
IT之家
IT之家
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
M
MIT News - Artificial intelligence
WordPress大学
WordPress大学
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
小众软件
小众软件
有赞技术团队
有赞技术团队

流动

山西之旅 | 流动 博客焕新,记录继续 | 流动 友链 | 流动 博客加速实践 广府古城一日游 我做了一个口播短视频二创工具:VideoRemaker Windows 下 Codex Cli 更新报 Move-Item is denied 错误的解决 Caddy 转发 GOST 报 TLS internal error 问题的排查与解决 对口型视频合成方案对比:Wav2Lip、VideoReTalking 与 MuseTalk 2026 音色克隆方案对比:IndexTTS-2、CosyVoice、GPT-SoVITS、Fish Speech、VoxCPM 部署与实测 AI Agent折腾记(OpenClaw / Hermes Agent) 我的2025年 大连之行 回家收麦 六一儿童节爬长城 Golang database/sql 数据库断线自动重连机制解析 Golang默认Http Client导致的cannot assign requested address错误 清明踏春,爬山看海 购入小牛G400T电动车 北京的三月飞雪 wrenAI本地LLM模型部署 天津一日游 2024年终总结 停止使用staticfile.org服务 使用 ImageMagick 自动添加水印,保护图片版权 如何注册一个.sol域名 奥森公园半日游 昌平42公里骑行绿道打卡 十月一日爬慕田峪长城 当Hugo遇上AVIF,优化图片加载
Golang解析json的一个问题
Liudon · 2022-05-20 · via 流动

业务模块从php迁移到golang下了,最近遇到一个golang下json解析的问题:

请求接口,按返回包字段判断请求成功与否。

伪代码如下:

package main

import (
	"encoding/json"
	"fmt"
)

type Response struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

func main() {
	// 场景1,返回包符合接口要求
	str := `{"code":100,"msg":"failed"}`
	var res Response
	json.Unmarshal([]byte(str), &res)
	fmt.Printf("res=%+v\n", res)
    // 解析正确,符合预期
	// res={Code:100 Msg:failed}

	// 场景2,返回包不符合接口要求,缺少相关字段
	str = `{"retCode":100,"retMsg":"failed"}`
	var res1 Response
	json.Unmarshal([]byte(str), &res1)
	fmt.Printf("res=%+v\n", res1)
    // 解析错误,不符合预期
	// res={Code:0 Msg:}
}

这里由于接口地址配置错误,导致请求到其他接口,返回包不符合协议要求。

缺少code字段,Unmarshal解析后,按默认值处理,所以code为0,导致验证出错。

修正方案:

Code字段定义为引用类型,通过判断地址是否为nil来区分缺少字段的情况。

package main

import (
	"encoding/json"
	"fmt"
)

type Response struct {
	Code *int   `json:"code"`
	Msg  string `json:"msg"`
}

func main() {
	// 返回包符合接口要求
	str := `{"code":100,"msg":"failed"}`
	var res Response
	json.Unmarshal([]byte(str), &res)
	fmt.Printf("res=%+v\n", res)
	// 解析正确,符合预期
	// res={Code:100 Msg:failed}

	if res.Code == nil || *res.Code > 0 {
		fmt.Println("request failed")
	}

	// 返回包不符合接口要求,缺少相关字段
	str = `{"id":1}`
	var res1 Response
	json.Unmarshal([]byte(str), &res1)
	fmt.Printf("res=%+v\n", res1)
	// 解析错误,不符合预期
	// res={Code:0 Msg:}

	if res1.Code == nil || *res1.Code > 0 {
		fmt.Println("request failed")
	}
}

参考资料:

how-to-determine-if-a-json-key-has-been-set-to-null-or-not-provided

json-key-not-set-null-golang