2017-06-12 56 views
-4

我想獲得JSON格式的CF命令的輸出,但我不確定要使用json.Marshaljson.MarshalIndentjson.Marshal和json.MarshalIndent使用Go有什麼區別?

我需要的輸出是這樣的:

{ 
    "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

我認爲這個文檔很清楚。 json.Marshal()json.MarshalIndent()產生一個JSON文本結果(形式爲[]byte),但前者執行沒有縮進的緊湊輸出,後者應用(可定製的)縮進。引用自json.MarshalIndent()的文檔:

MarshalIndent類似於Marshal,但適用縮進格式化輸出。

參見這個簡單的例子:

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) 
} 

輸出(在上試試這個):

{"key":"value"} 
{ 
    "key": "value" 
} 
+0

非常感謝,但我有另一個問題,我將有多個鍵和值,我想在循環內使用json.marshalIdent,你可以修改代碼嗎? – Foudel

+0

@Foudel如果您有特定的問題,請將其包含在問題中。我不知道你的代碼。另外請注意,您可以將包含切片的切片或結構傳遞給'json.Marshal()',並且它們將被正確編組爲JSON數組。你不需要「手動」。 – icza

+0

已經改變了實際上我從來沒有使用的代碼去我只需要這個小修改一次永遠。 – Foudel