Go中JSON反序列化interface类型数字的类型及转字符串问题
JSON数字/字符串ID的反序列化与统一转换处理
反序列化后的类型说明
当JSON中的ID是数字形式时,ffjson(和Go标准库encoding/json行为一致)会将其反序列化为float64类型存入interface{}字段;如果ID是字符串形式,反序列化后就是string类型。这是因为JSON规范里没有单独的整数类型,所有数字都属于浮点数范畴,无类型约束的interface{}会默认用float64承载数字值。
你的测试代码运行后会输出如下结果,能直观看到类型差异:
type=float64, value={123456} type=string, value={"1234"}
统一转换为字符串类型的实现
可以通过类型断言区分两种情况,把ID统一转成字符串。考虑到ID本质是整数,处理float64时先转成整数再转字符串,避免出现123456.0这类带小数点的无效结果。
修改后的完整代码如下:
package main import ( "fmt" "strconv" "github.com/pquerna/ffjson/ffjson" ) type Person struct { ID interface{} } func convertIDToString(id interface{}) string { switch v := id.(type) { case float64: // 转成int64再转字符串,避免小数点 return strconv.FormatInt(int64(v), 10) case string: return v default: // 处理异常类型,返回空字符串或自定义标记 return "" } } func main() { var message = "{\"ID\": 123456}" var message1 = "{\"ID\": \"1234\"}" var person, person1 Person ffjson.Unmarshal([]byte(message), &person) ffjson.Unmarshal([]byte(message1), &person1) idStr := convertIDToString(person.ID) idStr1 := convertIDToString(person1.ID) fmt.Printf("原ID类型=%T,转换后:%s\n", person.ID, idStr) fmt.Printf("原ID类型=%T,转换后:%s\n", person1.ID, idStr1) }
运行这段代码会输出:
原ID类型=float64,转换后:123456 原ID类型=string,转换后:1234
内容的提问来源于stack exchange,提问作者Violetta
相关产品推荐
相关产品推荐

