json - 如何解码包含整数、 float 和数字字符串的 JSON?

标签 json go

我有多个不同的 JSON 数据请求被传递到我的 Go 应用程序,其中包含不同格式的数字。请求示例如下:

{
    "stringData":"123456",
    "intData": 123456,
    "floatData": 123456.0
}

有没有办法将此数据解码为由 JSON 数据确定的类型。例如,字符串数据为“123456”,整型数据为 123456,浮点型数据为 123456.0。我没有为这些 JSON 对象定义结构,因此无法为这些对象创建结构。

我看过decoder.UseNumber() 方法将数据转换成字符串,但我不知道之后如何处理stringData 和intData 之间的差异。

最佳答案

使用 UseNumber 解码为 map[string]interface{}选项。使用 type assertion查找数字并根据“.”的存在进行转换。

dec := json.NewDecoder(r)
dec.UseNumber()

var m map[string]interface{}
err := dec.Decode(&m)
if err != nil {
    log.Fatal(err)
}

for k, v := range m {
    v, err := decodeValue(v)
    if err != nil {
        log.Fatal(err)
    }
for k, v := range m {
    v, err := decodeValue(v)
    if err != nil {
        log.Fatal(err)
    }
    switch v := v.(type) {
    case string:
        fmt.Printf("%s is a string with value %q\n", k, v)
    case int64:
        fmt.Printf("%s is a integer with value %d\n", k, v)
    case float64:
        fmt.Printf("%s is a float with value %f\n", k, v)
    default:
        fmt.Printf("%s is a %T with value %v\n", k, v, v)
    }
}


...

func decodeValue(v interface{}) (interface{}, error) {
    if vv, ok := v.(json.Number); ok {
        if strings.Contains(vv.String(), ".") {
            return vv.Float64()
        } else {
            return vv.Int64()
        }
    } else {
        return v, nil
    }
}

Run it on the playground .

此示例打印找到的内容并在出现错误时退出程序。如果您的目标是创建具有正确类型值的映射,请将打印数字的代码替换为 m[k] = n

关于json - 如何解码包含整数、 float 和数字字符串的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55714557/

相关文章:

python - Django loaddata 验证错误

go - 包含 slice 的方法

go - 获取Go中分层结构的所有标签

node.js - 为 GO 执行的 Vue 应用程序应用更改

postgresql - 复合唯一键的 Gorm 标签

json - 如何使用 Postgres 在根级别更新多个 json 字段?

c# - 字典和对象的模型创建问题

json - 在Go中检查嵌套指针结构是否为nil的简便方法?

javascript - 在 JavaScript 中将字符串转换为 JSON

objective-c - isValidJSONObject 未按预期工作