2017-10-12 3 views
1

J'ai une structure JSON en dessous, qui possède un tableau d'objets.Comment filtrer un objet JSON en fonction d'une condition, puis sélectionner simplement quelques clés de l'objet filtré à l'aide de l'analyseur JQ

{ 
    "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 
    } 
} 

Je veux filtrer l'objet en fonction état, où product.type == mobile puis dans les objets correspondant, je veux juste les id et service champs. Donc, dans l'exemple ci-dessus, ci-dessous serait le O/P.

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

Je suis en mesure d'extraire les objets correspondants à l'aide du

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

mais après comment puis-je filtrer seulement les service et id champ d'objet?

+0

Votre 'entrée JSON' est syntaxiquement incorrect , Copiez le coller dans https://jsonlint.com/ et le voir par vous-même – Inian

+0

@Inian, c'est bien comme je l'ai dit, en utilisant le 'chat myjson.json | jq 'select (.product.type == "moble")' ', je suis capable d'obtenir l'objet correspondant à mes critères., JQ fonctionne bien pour cela. –

+0

Vous avez une faute de frappe dans 'moble' et à moins que le json ne soit corrigé,' jq' ne peut pas l'analyser – Inian

Répondre

1

Peut-être que cela vous aidera:

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

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

+0

Je veux utiliser l'analyseur 'jq'. –

+0

réponse mise à jour, @AmitKhandelwal –

0

Les données actuellement affichées dans la question n'est pas strictement JSON, mais étant donné que l'OP mentionne l'entrée est censé être un tableau, la Ce qui suit suppose que les données sont un tableau JSON des objets.

Une solution succincte est alors:

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

Avec les données d'entrée ajustées comme décrit ci-dessus, la sortie serait comme indiqué, à savoir:

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