Go - 在 json.Marshal 中自动将字符串值转换为 int 值
Go - convert string value to int value automatically in json.Marshal
我有[]map[string]string.Values present can be integer(in string form) "1".我想自动转换成像1这样的int值。
示例:
map1 := []map[string]string{
{"k1": "1", "k2": "some value"},
{"k1": "-12", "k2": "some value"},
}
我想像这样使用 json.marshal
将其转换为 json
{{"k1":1,"k2":"some value"}{"k1":-12,"k1":"some value"}}
我该如何实现。
您可以创建自定义类型,并在该类型上实现 json.Marshaller 接口。该方法实现可以透明地进行 string -> int 转换:
type IntValueMarshal []map[string]string
func (ivms IntValueMarshal) MarshalJSON() ([]byte, error) {
// create a new map to hold the converted elements
mapSlice := make([]map[string]interface{}, len(ivms))
// range each of the maps
for i, m := range ivms {
intVals := make(map[string]interface{})
// attempt to convert each to an int, if not, just use value
for k, v := range m {
iv, err := strconv.Atoi(v)
if err != nil {
intVals[k] = v
continue
}
intVals[k] = iv
}
mapSlice[i] = intVals
}
// marshal using standard marshaller
return json.Marshal(mapSlice)
}
要使用它,类似于:
values := []map[string]string{
{"k1": "1", "k2": "somevalue"},
}
json.Marshal(IntValueMarshal(values))
我有[]map[string]string.Values present can be integer(in string form) "1".我想自动转换成像1这样的int值。
示例:
map1 := []map[string]string{
{"k1": "1", "k2": "some value"},
{"k1": "-12", "k2": "some value"},
}
我想像这样使用 json.marshal
将其转换为 json {{"k1":1,"k2":"some value"}{"k1":-12,"k1":"some value"}}
我该如何实现。
您可以创建自定义类型,并在该类型上实现 json.Marshaller 接口。该方法实现可以透明地进行 string -> int 转换:
type IntValueMarshal []map[string]string
func (ivms IntValueMarshal) MarshalJSON() ([]byte, error) {
// create a new map to hold the converted elements
mapSlice := make([]map[string]interface{}, len(ivms))
// range each of the maps
for i, m := range ivms {
intVals := make(map[string]interface{})
// attempt to convert each to an int, if not, just use value
for k, v := range m {
iv, err := strconv.Atoi(v)
if err != nil {
intVals[k] = v
continue
}
intVals[k] = iv
}
mapSlice[i] = intVals
}
// marshal using standard marshaller
return json.Marshal(mapSlice)
}
要使用它,类似于:
values := []map[string]string{
{"k1": "1", "k2": "somevalue"},
}
json.Marshal(IntValueMarshal(values))