使用gjson解析JSON时,age字段整数检测始终返回false求助
排查gjson检测age是否为整数始终返回false的问题
我之前在使用gjson处理JSON的时候也踩过类似的类型判断坑,结合你的情况,大概率是这几个常见原因导致的,给你逐个分析:
1. JSON中的age是字符串格式的数字
这是最常见的情况!如果你的原始JSON里age是用引号包裹的字符串(比如{"name":"张三", "age":"30"}),而不是纯数字类型({"age":30}),gjson会严格识别它的类型为String,而非Number。这时候你判断它是否为整数自然会返回false。
解决方法:
- 先检查类型再处理:
ageRes := gjson.Get(yourJson, "age") if ageRes.Type == gjson.Number { // 转换为整数使用 age := int(ageRes.Int()) // 后续逻辑 } else { // 处理字符串类型的数字,比如先转成字符串再转int strAge := ageRes.Str age, err := strconv.Atoi(strAge) if err != nil { // 不是有效的数字字符串,做错误处理 } }
2. 错误的类型判断逻辑
gjson的类型判断有自己的规则,别用常规的Go类型判断方式:
- 不要直接用
reflect.TypeOf(ageRes.Value)判断是否为int:因为JSON中的数字在gjson里默认是以float64类型存储的,哪怕是整数,Value也会是float64,直接判断int类型肯定不成立。 - 不要臆造方法:gjson没有
IsInt()这类方法,正确的方式是检查ageRes.Type是否等于gjson.Number,之后再用Int()方法将其转换为整数(如果是合法整数的话,Int()会自动处理float64转int)。
3. JSON路径错误导致提取到空值
如果你的age字段在嵌套结构里(比如{"user":{"age":25}}),但你用了错误的路径gjson.Get(jsonStr, "age"),这时候提取到的结果类型是Null,判断整数肯定返回false。
快速调试技巧
在判断前先打印这两个值,能瞬间定位问题:
ageRes := gjson.Get(yourJson, "age") fmt.Println("提取到的原始内容:", ageRes.Raw) fmt.Println("提取结果的类型:", ageRes.Type)
- 如果
Raw是带引号的字符串,那就是类型问题; - 如果
Type是Null,那就是路径错了; - 如果
Type是Number但判断还是有问题,再检查你的判断逻辑是否写反了或者有其他错误。
内容的提问来源于stack exchange,提问作者Matias Barrios
相关产品推荐
相关产品推荐

