我有多个不同的 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
}
}
此示例打印找到的内容并在出现错误时退出程序。如果您的目标是创建具有正确类型值的映射,请将打印数字的代码替换为 m[k] = n
。
关于json - 如何解码包含整数、 float 和数字字符串的 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55714557/