我是Golang的新手。我必须在 Golang 中串化一个map[string]interface{}
,就像你在 javascript 中做一个JSON.stringify
一样。在具有其值的 javascript 键中undefined
当您执行JSON.stringify
时会被省略,当我在 Golang 中为nil
值json.Marshal
时,我想要同样的事情。例如在javascript中
var activity = {"isvalid": true, "value": {"prop": undefined}, "prop": undefined}
console.log(JSON.stringify(activity))
// Output: {"isvalid":true,"value":{}}
但是在戈朗,如果我这样做
activity := map[string]interface{}{
"isvalid": true,
"value": map[string]interface{}{"prop": nil},
"prop": nil,
}
jsonStr, _ := json.Marshal(activity)
fmt.Println(string(jsonStr))
// output: {"isvalid":true,"prop":null,"value":{"prop":null}}
https://play.golang.org/p/dvmz32phdNU
输出是有区别的,在 Golang 中使输出与 Javascript 相同有什么好方法?
编辑:
用例涉及从各种map[string]interface{}
类型的来源获取数据,键可以是任意的,因此将其转换为结构对我来说不是一个选择。
https://play.golang.org/p/KeeU7eagWh6
将变量定义为结构,并标记每个字段应如何编组为 json。 有一个省略标记可用于忽略 nil 字段。参考提供的示例
由于 OP 提到他不能使用结构体,另一种方法是递归地遍历映射并删除值为 nil 的条目。
https://play.golang.org/p/PWd9fpWrKZH
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := map[string]interface{}{
"isvalid": true,
"value": map[string]interface{}{"prop": nil},
"prop": nil,
}
final := removeNils(data)
out, err := json.Marshal(final)
if err != nil {
panic(err)
}
fmt.Println(string(out))
}
func removeNils(initialMap map[string]interface{}) map[string]interface{} {
withoutNils := map[string]interface{}{}
for key, value := range initialMap {
_, ok := value.(map[string]interface{})
if ok {
value = removeNils(value.(map[string]interface{}))
withoutNils[key] = value
continue
}
if value != nil {
withoutNils[key] = value
}
}
return withoutNils
}