当前位置: 首页 > 面试题库 >

是否有用于golang的jq包装器,它可以产生人类可读的JSON输出?

陈马鲁
2023-03-14
问题内容

我正在编写一个go程序(我们称其为foo),该程序在Standard Out上输出JSON。

$ ./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"
}

string这些indent功能的2个参数是:

prefix, indent string

说明在文档中:

JSON对象或数组中的每个元素都从一个新的缩进行开始,该行以前缀开头,然后根据缩进嵌套嵌套一个或多个缩进副本。

因此,每个换行符均以开头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的go程序(我们称之为foo)。 为了使输出易于阅读,我必须将其通过管道传递到jq中,例如: 有没有办法使用开源的jq包装器来达到相同的结果?我试图找到一些,但是它们通常包装了用于过滤JSON输入的功能,而不是美化JSON输出。 问题答案: 该软件包支持开箱即用的漂亮输出。您可以使用。或者,如果您正在使用,请在调用之前调用其方法(从Go 1.7开始

  • 我需要一个不可重入的读写锁,因为锁可能由获取它的线程以外的线程释放。(我意识到这一点时,我开始间歇性地获取非法监视器状态异常。) 我不确定不可重入是否是正确的术语。ReentrantLock允许当前持有锁的线程再次获取它。我不想要这种行为,因此我称之为“不可重入”。 上下文是我有一个使用线程池的套接字服务器。每个连接没有一个线程。请求可能由不同的线程处理。客户端连接可能需要在一个请求中锁定,在另一

  • 问题内容: 简而言之,我需要能够将已编译的可执行文件粘贴到Java jar文件中,然后能够从Java运行它(可能通过)。 的 原因 ,是我想使用Java来包裹ImageMagick的可执行文件成分的图像处理弹性的Map Reduce任务。EMR只希望获取一个jar文件,因此我认为没有空间在旋转的数据节点上安装软件。 问题答案: jar中的可执行文件是一种资源,您可以通过Stream访问它,并将可执

  • 问题内容: 我有以下测试方法,该方法使用从包中导入的函数。 可以在golang中进行模拟吗? 问题答案: 是的,只需进行简单的重构即可。创建一个函数类型的变量,用初始化,并让您的包调用而不是: 在测试中,您可以为分配另一个功能,该功能是在测试中定义的,并且可以执行测试所需的功能。 例如:

  • 假设我有一个(嵌套的)字典,如下所示(注意lists-values): 我正在寻找一种正确的方法来打印这本词典,我使用来完成此操作: 我相信上面的内容更容易阅读,而且可能有python库可以做到这一点。

  • 问题内容: 我已经使用JAXB编写了许多类进行序列化,并且我想知道是否存在一种基于注释为每个对象生成XSD文件的方法。有这个工具吗? 喜欢的东西是 真棒 。有什么可以做的吗? 问题答案: 是的,您可以在JAXBContext上使用该方法: 您可以利用实现控制输出的位置: