使用jq转换特定字段

4

我有一个JSON对象,其中一个字段的值可以是字符串或数组。

{
  "roles": ["ADMIN", "USER"]
  "user_id": 100,
  "message": "abc added a user xyz",
  "level": "info",
  "created_at": "2014-10-12 14:06:37"
}
{
  "roles": "ADMIN"
  "user_id": 102,
  "message": "a added a user b",
  "level": "info",
  "created_at": "2014-10-12 14:06:37"
}

我想将“角色”字段转换为csv格式,同时保留其他字段不变。
{
  "roles": "ADMIN,USER"
  "user_id": 100,
  "message": "abc added a user xyz",
  "level": "info",
  "created_at": "2014-10-12 14:06:37"
}
{
  "roles": "ADMIN"
  "user_id": 102,
  "message": "a added a user b",
  "level": "info",
  "created_at": "2014-10-12 14:06:37"
}

我尝试阅读文档,但找不到一个仅转换单个字段的构造。使用Jq可以实现吗?

1个回答

6

一种选择是使用过滤器:

.roles |= if type == "array" then join(",") else . end

在第一个示例中,这将生成值:“ADMIN,USER”。 更健壮的筛选器应该是:
.roles |= if type == "array" then map(tostring)|join(",") else . end

更健壮的做法是在then语句中使用@csv,但这将产生比您想要的更多的引号:

"\"ADMIN\",\"USER\""

因此,您可能想考虑使用@tsv;这将生成:
"ADMIN\tUSER"

1
它起作用了,谢谢 :) 实际上,我不得不问这个问题,因为 @csv 对于具有数组字段的对象失败了。所以这是必要的,让 @csv 起作用。 - Sumit Jain
"@csv"需要原子数组(即字符串、数字、布尔值、空值),因此了解到底出了什么问题会很有趣。 - peak
当运行@csv时,我收到错误消息array(["ADMIN...])在CSV行中无效。传递给它的对象是["2017-10-12T08:36:37.763Z", "info", 0, ["ADMIN], 1507797397763, 264074]`。 - Sumit Jain
你是不是想用join(",")代替?我说的是将整个对象转换为csv格式...如果是这种情况请忽略。 - Sumit Jain
为了更清晰明了,进行了更新。 - peak

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