You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:52:20