2016-11-01 11 views
2

私はwoocommerce APIを使用して情報を取得して保存しています。現在、私たちのセットアップは、アンダースコアの代わりにラクダのケースを使用するように設計されています。私はjqを使って情報を処理していますが、私はsub(regex, tostring)関数を使ってJSelの下線をcamelCaseと置き換えることができますか?ここでJQを使用したJSONのアンダースコアの置換

は、例えば、コード

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

の一例ですので、私が見つけたことで別の答えによると、これは動作します: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

ここで何をしたいのようだ "ABCDEF"、に "a_bcd_ef" に変換されますJQ機能です:あなたは簡単なものにしたい場合は

"a_bcd_ef" | camel 

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

使用例

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

あなただけの "_ [AZ]" の最初の出現をしたい場合:STDINからJSON文字列を処理する-liner変換したら、もちろんsubを使用します。等々。

は、オブジェクト内のすべてのキーにこの機能を適用するには、あなたが書くことができる:

with_entries(.key |= camel) 

はJSONエンティティ内のすべてのオブジェクト内のすべてのキーを変更するには、使用することができwalk/1

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

あなたのjqにwalk/1がない場合は、呼び出される前に、または〜/ .jqファイルの中に、その定義を簡単に(グーグルで簡単に見つかります)含めることができます。

関連する問題