如何在Golang中将JSON中键的int类型值转为string类型
在Golang中将JSON中所有整数值转换为字符串类型
需求描述
需要实现一个功能:将指定JSON中所有键对应的整数类型值转换为字符串类型。
输入JSON示例
{ "id": 12345, "wrapper": 898984, "sections": { "main": { "type": 76899 } }, "order": [ 82322 ] }
期望输出JSON示例
{ "id": "12345", "wrapper": "898984", "sections": { "main": { "type": "76899" } }, "order": [ "82322" ] }
解决方案
通过递归遍历JSON解析后的interface{}结构,识别整数类型(包括JSON解析默认生成的float64类型整数)并转换为字符串。以下是完整实现代码:
package main import ( "encoding/json" "fmt" "strconv" ) // convertIntsToStrings 递归遍历数据结构,将所有整数值转换为字符串 func convertIntsToStrings(v interface{}) interface{} { switch val := v.(type) { case map[string]interface{}: for key, value := range val { val[key] = convertIntsToStrings(value) } return val case []interface{}: for index, value := range val { val[index] = convertIntsToStrings(value) } return val case float64: // 判断是否为无小数部分的整数 if val == float64(int64(val)) { return strconv.FormatInt(int64(val), 10) } return val case int: return strconv.Itoa(val) case int64: return strconv.FormatInt(val, 10) default: // 其他类型保持原样返回 return val } } func main() { input := []byte(`{ "id": 12345, "wrapper": 898984, "sections": { "main": { "type": 76899 } }, "order": [ 82322 ] }`) var rawData interface{} if err := json.Unmarshal(input, &rawData); err != nil { fmt.Printf("JSON解析失败: %v\n", err) return } processedData := convertIntsToStrings(rawData) output, err := json.MarshalIndent(processedData, "", " ") if err != nil { fmt.Printf("JSON生成失败: %v\n", err) return } fmt.Println(string(output)) }
代码说明
- 递归遍历:函数通过类型断言识别JSON解析后的三种核心结构——对象(
map[string]interface{})、数组([]interface{})和基本类型,对前两者进行递归遍历处理。 - 整数判断与转换:由于JSON解析时会将整数转为
float64类型,因此需要判断该浮点数是否为无小数部分的整数,再转换为十进制字符串;同时直接处理int、int64等原生整数类型。 - 兼容性:其他类型(字符串、布尔值、null等)保持原有类型不变,不影响JSON结构。
内容的提问来源于stack exchange,提问作者Biswajit Das
相关产品推荐
相关产品推荐

