如何美化打印一个Golang结构体?

12
我正在对结构体进行非编组操作,并希望以格式化的方式打印它。
我的代码(https://play.golang.org/p/D0KwGP6Cxa0)目前产生以下输出:
main.ADIStruct{CondensedADI:[]main.CondensedADI{main.CondensedADI{Name:"Type", Value:"title"}, main.CondensedADI{Name:"Title", Value:"Ste Life_S01_E10_"}, main.CondensedADI{Name:"Title_Brief", Value:"Ste Life_S01_E10_HD"}, main.CondensedADI{Name:"Episode_Name", Value:"Cody Goes to Camp"}, main.CondensedADI{Name:"Episode_ID", Value:"10"}, main.CondensedADI{Name:"Summary_Short", Value:"Zack is excited to finally get rid of his brother when Cody leaves for math camp."}, main.CondensedADI{Name:"Rating", Value:"TV-G"}, main.CondensedADI{Name:"Run_Time", Value:"00:22:50"}, main.CondensedADI{Name:"Display_Run_Time", Value:"00:23"}, main.CondensedADI{Name:"Year", Value:"2005"}, main.CondensedADI{Name:"Closed_Captioning", Value:"Y"}, main.CondensedADI{Name:"Genre", Value:"Family"}, main.CondensedADI{Name:"Billing_ID", Value:"00000"}, main.CondensedADI{Name:"Actors_Display", Value:"Ashley Tisdale ( Maddie ), Brenda Song ( London ), Cole Sprouse ( Cody ), Dylan Sprouse ( Zack ), Kim Rhodes ( Carey ), Phill Lewis ( Moseby )"}, main.CondensedADI{Name:"Licensing_Window_Start", Value:"2019-05-15 00:00:00"}, main.CondensedADI{Name:"Licensing_Window_End", Value:"2019-10-31 00:00:00"}, main.CondensedADI{Name:"Preview_Period", Value:"0"}, main.CondensedADI{Name:"Display_As_New", Value:"7"}, main.CondensedADI{Name:"Display_As_Last_Chance", Value:"7"}, main.CondensedADI{Name:"Provider_QA_Contact", Value:"DATG.DL-VOD.Support@disney.com"}, main.CondensedADI{Name:"Suggested_Price", Value:"0.00"}, main.CondensedADI{Name:"Category", Value:"Disney Channel HD/Suite Life"}}}

我希望它只有名称和值,并在每个项目后面换行。就像这样:
Name:"Type", Value:"title"

Name:"Title", Value:"Ste Life_S01_E10_"

有什么想法我怎么能做到这一点吗?
2个回答

34

Go标准库中有一个函数,它接受interface{}参数并生成缩进的JSON输出:json.MarshalIndent

以下是如何将其应用于您的用例的示例(https://play.golang.org/p/3geUEEHESSa):

s, _ := json.MarshalIndent(b, "", "\t")
fmt.Print(string(s))

虽然不完全符合您的预期,但这将产生一个相当易读的JSON输出:
{
    "CondensedADI": [
        {
            "Name": "Type",
            "Value": "title"
        },
        {
            "Name": "Title",
            "Value": "Ste Life_S01_E10_"
        },
        ...

1
这个工作得非常好!最后一个问题。如果我想要排除某些JSON名称,比如“Type”或“Title”,有没有简单的方法可以做到这一点? - lakeIn231
我对此不确定,我会深入研究这个话题。与此同时,您应该创建一个新问题以最大化可见性。 - aymericbeaumet
2
https://stackoverflow.com/questions/56242969/how-to-exclude-certain-names-in-a-json-unmarshal-golang - lakeIn231
3
JSON编组会丢失关于Go结构体的大量信息,并且不适用于所有数据类型,因此通常不是此类操作的最佳选择。 - Jonathan Hall
@Flimzy 谢谢,你有什么推荐吗?我看到Marcio推荐了https://github.com/davecgh/go-spew - aymericbeaumet
1
我所推荐的取决于你的使用情况。对于调试,spew 是一个很好的选择。如果你要转储数据供最终用户使用,甚至可能需要使用 HTML 或其他标记语言进行标记。因此,这完全取决于具体情况。 - Jonathan Hall

4

这可能是针对重复问题的重复答案,但与json.MarshalIndent()相比,使用go-spew是一个很好的替代方案,它能提供更多详细信息和格式选项:https://github.com/davecgh/go-spew


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接