gpt4 book ai didi

json - 是否有 golang 的 jq 包装器可以生成人类可读的 JSON 输出?

转载 作者:IT王子 更新时间:2023-10-29 00:38:33 26 4
gpt4 key购买 nike

我正在编写一个在标准输出上输出 JSON 的 go 程序(我们称之为 foo)。

$ ./foo
{"id":"uuid1","name":"John Smith"}{"id":"uuid2","name":"Jane Smith"}

为了使输出易于阅读,我必须将其通过管道传输到 jq 中,如下所示:

$ ./foo | jq .

{
"id":"uuid1",
"name": "John Smith"
}
{
"id":"uuid2"
"name": "Jane Smith"
}

有没有办法使用开源的 jq 包装器实现相同的结果?我试着找到一些,但它们通常包装了过滤 JSON 输入的功能,而不是美化 JSON 输出。

最佳答案

encoding/json包支持开箱即用的漂亮输出。您可以使用 json.MarshalIndent() .或者,如果您使用的是 json.Encoder , 然后调用它的 Encoder.SetIndent() (自 Go 1.7 以来新增)调用 Encoder.Encode() 之前的方法.

例子:

m := map[string]interface{}{"id": "uuid1", "name": "John Smith"}

data, err := json.MarshalIndent(m, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(data))

enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
if err := enc.Encode(m); err != nil {
panic(err)
}

输出(在 Go Playground 上尝试):

{
"id": "uuid1",
"name": "John Smith"
}
{
"id": "uuid1",
"name": "John Smith"
}

如果你只想格式化“准备好的”JSON 文本,你可以使用 json.Indent()功能:

src := `{"id":"uuid1","name":"John Smith"}`

dst := &bytes.Buffer{}
if err := json.Indent(dst, []byte(src), "", " "); err != nil {
panic(err)
}
fmt.Println(dst.String())

输出(在 Go Playground 上尝试):

{
"id": "uuid1",
"name": "John Smith"
}

这些 indent 函数的 2 个 string 参数是:

prefix, indent string

解释在文档中:

Each element in a JSON object or array begins on a new, indented line beginning with prefix followed by one or more copies of indent according to the indentation nesting.

因此每个换行符都将以 prefix 开头,然后是 0 个或多个 indent 副本,具体取决于嵌套级别。

如果您像这样为它们指定值,它会变得清晰明了:

json.Indent(dst, []byte(src), "+", "-")

用嵌入式对象测试它:

src := `{"id":"uuid1","name":"John Smith","embedded:":{"fieldx":"y"}}`

dst := &bytes.Buffer{}
if err := json.Indent(dst, []byte(src), "+", "-"); err != nil {
panic(err)
}
fmt.Println(dst.String())

输出(在 Go Playground 上尝试):

{
+-"id": "uuid1",
+-"name": "John Smith",
+-"embedded:": {
+--"fieldx": "y"
+-}
+}

关于json - 是否有 golang 的 jq 包装器可以生成人类可读的 JSON 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42788045/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com