2017-10-12 6 views
1

オブジェクトの配列を持つ、以下のJSON構造を持っています。条件に基づいてJSONオブジェクトをフィルタリングし、JQパーサを使用してフィルタリングされたオブジェクトから少数のキーを選択する方法

私は product.type == mobile条件に基づいてオブジェクトをフィルタリングすると、次に一致するオブジェクトで、私はちょうど idserviceフィールドにしたい。
{ 
    "payload": { 
    "location": { 
     "uid": 1, 
     "type": "foo" 
    }, 
    "name": "foo", 
    "maxResults": 10 
    }, 
    "product": { 
    "uid": "1232323", 
    "source": "foo", 
    "service": "pricing", 
    "version": "0.1", 
    "time": 1507602150899, 
    "type": "mobile", 
    "id": 1 
    } 
} 
{ 
    "payload": { 
    "location": { 
     "uid": 2, 
     "type": "bar" 
    }, 
    "name": "bar", 
    "maxResults": 10 
    }, 
    "product": { 
    "uid": "244434242", 
    "source": "bar", 
    "service": "pricing", 
    "version": "0.2", 
    "time": "1507602ds0899", 
    "type": "phone", 
    "id": 2 
    } 
} 

したがって、上記の例では、以下はO/Pです。

{ 
    "service" : "pricing", 
    "id" : 1 
} 

私は

cat myjson.json | jq 'select(.product.type == "moble")' 

を使用して、一致するオブジェクトを抽出することができていますが、その後どのように私は、オブジェクトの唯一のserviceidフィールドをフィルタリングすることができますか?

+0

あなた 'JSON'入力が構文的に正しくありませんコピーはhttps://jsonlint.com/に貼り付けて自分で見てください – Inian

+0

@Inian、私が言ったように、 'cat myjson.json | jq 'select(.product.type == "moble")' '、私の基準に一致するオブジェクトを取得することができます。 –

+0

あなたは 'moble 'にタイプミスがあり、jsonが修正されない限り、' jq'はそれを解析できません。 – Inian

答えて

1

おそらくこれはあなたを助けるでしょう:

map(select(.product.type == "mobile")) | .[] | {id: .product.id, service: .product.service} 

https://jqplay.org/s/6zMyKjTehN

+0

私は 'jq'パーサーを使いたいです。 –

+0

答えが更新されました、@AmitKhandelwal –

0

、現在問題に示されているデータは厳密にJSONではありませんが、OPは言及しているので、入力が配列することになっています、以下は、データがオブジェクトのJSON配列であることを前提としています。

簡潔溶液は次にある:上記、出力、すなわち、図示されるように調整入力データと

data[] | .product | select(.type == "mobile") | {service, id} 

{"service":"pricing","id":1} 
関連する問題