使用Go的json.Marshal和json.MarshalIndent有什么区别?

时间:2017-06-12 09:07:06

标签: json go marshalling

我想以JSON格式获得CF命令的输出,但我不确定要使用json.Marshal还是json.MarshalIndent

我需要的输出是这样的:

{
    "key1": "value1",
     ....
    "keyn": "valuen",
}

这是旧的例子,但它不是所需的输出:

cmd.ui.Say(terminal.EntityNameColor(T("User-Provided:")))   
  for _, key := range keys {        
         // cmd.ui.Say("%s: %v", key, envVars[key])
         here needed a new one with json.marshalIdent
 }

我从未使用过去,所以我真的不知道使用哪一个以及如何使用。

1 个答案:

答案 0 :(得分:1)

我认为该文件非常明确。两个json.Marshal() 并且json.MarshalIndent()生成一个JSON文本结果(以[]byte的形式),但前者执行紧凑输出而没有缩进,后者适用(有些可自定义)缩进。引自json.MarshalIndent()的文档:

  

MarshalIndent就像Marshal一样,但是应用Indent来格式化输出。

见这个简单的例子:

type Entry struct {
    Key string `json:"key"`
}

e := Entry{Key: "value"}
res, err := json.Marshal(e)
fmt.Println(string(res), err)

res, err = json.MarshalIndent(e, "", "  ")
fmt.Println(string(res), err)

输出是(在Go Playground上尝试):

{"key":"value"} <nil>
{
  "key": "value"
} <nil>

还有json.Encoder

type Entry struct {
    Key string `json:"key"`
}
e := Entry{Key: "value"}

enc := json.NewEncoder(os.Stdout)
if err := enc.Encode(e); err != nil {
    panic(err)
}

enc.SetIndent("", "  ")
if err := enc.Encode(e); err != nil {
    panic(err)
}

输出(在Go Playground上试试这个):

{"key":"value"}
{
  "key": "value"
}