JSON.stringify equivalent in Golang for map[string]interface



我是Golang的新手。我必须在 Golang 中串化一个map[string]interface{},就像你在 javascript 中做一个JSON.stringify一样。在具有其值的 javascript 键中undefined当您执行JSON.stringify时会被省略,当我在 Golang 中为niljson.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
}

最新更新