猿问

Golang 中的 JSON.stringify 等价于 map

我是 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{}并且键可以是任意的,因此将其转换为结构对我来说不是一个选择。


qq_遁去的一_1
浏览 416回答 1
1回答

倚天杖

https://play.golang.org/p/KeeU7eagWh6将变量定义为结构并标记每个字段应如何编组为 json。有一个省略标签可用于忽略 nil 字段。请参阅提供的示例由于 OP 已经提到他不能使用结构,另一种方法是递归地遍历映射并删除值为 nil 的条目。https://play.golang.org/p/PWd9fpWrKZHpackage 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}
随时随地看视频慕课网APP

相关分类

Go
我要回答