使用JQ

时间:2016-11-01 18:40:48

标签: json regex key jq camelcasing

我正在使用woocommerce API来检索和存储信息。目前我们的设置旨在使用驼峰案例而不是下划线。我使用jq来处理我们的信息,但我很好奇如何使用sub(regex, tostring)函数将我的JSON中的下划线替换为camelCase?

这是代码

的一个例子
"line_items": [
    {
     "id": xxxx,
     "name": "xxxx",
     "sku": "xxxx",
     "product_id": xxxx,
    }

例如,根据我发现的SO的另一个答案,这有效:curl https://www.testsite.com/wp-json/wc/v1/orders -u user:pass | jq '.[] | with_entries( if .key | contains("_") then .key |= sub("_";"") else . end)'并删除下划线。

结果是:

"lineitems": [
    {
     "id": xxxx,
     "name": "xxxx",
     "sku": "xxxx",
     "productid": xxxx,
    }

然而,当我尝试curl https://www.testsite.com/wp-json/wc/v1/orders -u user:pass | jq '.[] | with_entries( if .key | contains("_") then .key |= sub("(\\_)([a-z])";"$2\u") else . end)'时,我没有得到我期望的结果。

预期结果将是:

"lineItems": [
    {
     "id": xxxx,
     "name": "xxxx",
     "sku": "xxxx",
     "productId": xxxx,
    }

我没有很多使用jq的经验,所以我不确定我做错了什么。这个问题有更好的解决方案吗?

2 个答案:

答案 0 :(得分:6)

这是一个将转换" a_bcd_ef"的jq函数。 to" aBcdEf",这似乎是你想要的:

def camel:
  gsub( "_(?<a>[a-z])"; .a|ascii_upcase);

使用示例:

"a_bcd_ef" | camel

如果你想要一个简单的单线程来处理来自STDIN的JSON字符串:

$ jq 'gsub( "_(?<a>[a-z])"; .a|ascii_upcase)'

如果您只想要第一次出现&#34; _ [a-z]&#34;已转换,当然您使用sub。等等。

要将此功能应用于对象中的所有键,您可以编写:

with_entries( .key |= camel )

要更改JSON实体中所有对象中的所有键,可以使用walk/1

walk(if type == "object" then with_entries(.key |= camel) else . end)

如果您的jq没有walk/1,那么您可以在调用之前或者在〜/ .jq文件中简单地包含其定义(通过谷歌搜索很容易找到)。

答案 1 :(得分:3)

虽然不如@peak的gsub解决方案简洁,但这个更容易上眼,初学者更容易理解恕我直言。

您可以将其放入名为“snake_to_camel.jq”和 chmod +x snake_to_camel.jq

的脚本中
#!/usr/bin/env jq -f
def head:
  .[0:1];

def tail:
  .[1:];

def capitalize:
  (head | ascii_upcase) + tail;

def snake_to_camel:
  split("_") |
  head + (tail | map(capitalize)) |
  join("");

def map_keys(mapper):
  walk(if type == "object" then with_entries(.key |= mapper) else . end);

map_keys(snake_to_camel)

示例用法:

curl https://example.com/input.json | ./snake_to_camel.jq

我在这里使用的一些 jq 功能: