2016-11-01 1 views
2

Je travaille avec l'API pour récupérer et stocker des informations. Actuellement, notre configuration est conçue pour utiliser des chameaux au lieu de traits de soulignement. J'utilise jq pour traiter nos informations, mais je suis curieux de savoir comment je peux utiliser la fonction sub(regex, tostring) pour remplacer les traits de soulignement dans mon JSON avec camelCase?Remplacement des traits de soulignement dans JSON à l'aide de JQ

Voici un exemple du code

"line_items": [ 
    { 
    "id": xxxx, 
    "name": "xxxx", 
    "sku": "xxxx", 
    "product_id": xxxx, 
    } 

Par exemple, selon une autre réponse sur de sorte que je trouve, cela fonctionne: curl https://www.testsite.com/wp-json/wc/v1/orders -u user:pass | jq '.[] | with_entries(if .key | contains("_") then .key |= sub("_";"") else . end)' et supprimer les underscores.

Le résultat est:

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

Cependant, lorsque je tente 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)' je ne reçois pas les résultats que je voudrais attendre.

Les résultats attendus seraient:

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

Je n'ai pas beaucoup d'expérience à l'aide jq donc je ne suis pas sûr de ce que je fais mal. Y a-t-il une meilleure solution à ce problème?

Répondre

2

est ici une fonction JQ qui convertira "a_bcd_ef" à "abcdef", qui semble être ce que vous voulez:

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

Exemple d'utilisation:

"a_bcd_ef" | camel 

Si vous voulez un simple -liner pour traiter les chaînes JSON de STDIN:

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

Si vous souhaitez que la première occurrence de "_ [az]" converti, alors bien sûr, vous utiliseriez sub. Etc.

Pour appliquer cette fonction à toutes les clés dans un objet, vous pouvez écrire:

with_entries(.key |= camel) 

Pour changer toutes les clés de tous les objets au sein d'une entité JSON, vous pouvez utiliser walk/1:

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

Si votre jq n'a pas walk/1 alors vous pouvez simplement inclure sa définition (facilement trouvée par googling), soit avant qu'elle soit invoquée, ou peut-être dans votre fichier ~/.jq.