2016-11-01 3 views
2

Я работаю с API woocommerce для извлечения и хранения информации. В настоящее время наша установка предназначена для использования верблюжьего корпуса вместо подчеркивания. Я использую jq для обработки нашей информации, но мне любопытно, как я могу использовать функцию sub(regex, tostring) для замены подчеркивания в моем JSON с помощью camelCase?Замена символа подчеркивания в JSON с использованием JQ

Вот пример кода

"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

Вот функция JQ, которая будет конвертировать "a_bcd_ef" в "ABCDEF", который, кажется, что вы хотите: использование

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

Пример:

"a_bcd_ef" | camel 

Если вы хотите простой один -liner обрабатывать JSON строки из STDIN:

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

Если вы хотите только первое вхождение "_ [аз]" тогда вы, конечно, будете использовать sub. И так далее.

Чтобы применить эту функцию для всех ключей в объекте, вы могли бы написать:

with_entries(.key |= camel) 

Чтобы изменить все ключи во всех объектах в формате JSON объекта, вы можете использовать walk/1:

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

Если ваш jq не имеет walk/1, вы можете просто включить его определение (легко найти по поисковому запросу), либо до его вызова, либо, возможно, в файл ~/.jq.