我是 Golang 的新手。我必须像在 javascriptmap[string]interface{}中那样在 Golang 中对 a 进行字符串化JSON.stringify。在 javascript 中,undefined当你这样做时,它们的值会被省略,JSON.stringify而当我json.Marshal在 Golang 中为nil值做时,我想要同样的事情。例如在 javascript 中var activity = {"isvalid": true, "value": {"prop": undefined}, "prop": undefined}console.log(JSON.stringify(activity)) // Output: {"isvalid":true,"value":{}}但是在 Golang 如果我这样做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{}并且键可以是任意的,因此将其转换为结构对我来说不是一个选择。
1 回答

倚天杖
TA贡献1828条经验 获得超3个赞
https://play.golang.org/p/KeeU7eagWh6
将变量定义为结构并标记每个字段应如何编组为 json。有一个省略标签可用于忽略 nil 字段。请参阅提供的示例
由于 OP 已经提到他不能使用结构,另一种方法是递归地遍历映射并删除值为 nil 的条目。
https://play.golang.org/p/PWd9fpWrKZH
package mainimport ( "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}
- 1 回答
- 0 关注
- 351 浏览
添加回答
举报
0/150
提交
取消